diff --git a/.github/update.log b/.github/update.log index e8e332cc2d..a4e0006dd4 100644 --- a/.github/update.log +++ b/.github/update.log @@ -758,3 +758,4 @@ Update On Thu Sep 5 20:35:23 CEST 2024 Update On Fri Sep 6 20:34:58 CEST 2024 Update On Sat Sep 7 20:31:47 CEST 2024 Update On Sun Sep 8 20:32:53 CEST 2024 +Update On Mon Sep 9 20:33:04 CEST 2024 diff --git a/clash-meta/adapter/provider/provider.go b/clash-meta/adapter/provider/provider.go index a99c1d9680..107b621b41 100644 --- a/clash-meta/adapter/provider/provider.go +++ b/clash-meta/adapter/provider/provider.go @@ -98,6 +98,10 @@ func (pp *proxySetProvider) Proxies() []C.Proxy { return pp.proxies } +func (pp *proxySetProvider) Count() int { + return len(pp.proxies) +} + func (pp *proxySetProvider) Touch() { pp.healthCheck.touch() } @@ -126,7 +130,7 @@ func (pp *proxySetProvider) getSubscriptionInfo() { ctx, cancel := context.WithTimeout(context.Background(), time.Second*90) defer cancel() resp, err := mihomoHttp.HttpRequestWithProxy(ctx, pp.Vehicle().(*resource.HTTPVehicle).Url(), - http.MethodGet, http.Header{"User-Agent": {C.UA}}, nil, pp.Vehicle().Proxy()) + http.MethodGet, nil, nil, pp.Vehicle().Proxy()) if err != nil { return } @@ -267,6 +271,10 @@ func (cp *compatibleProvider) Proxies() []C.Proxy { return cp.proxies } +func (cp *compatibleProvider) Count() int { + return len(cp.proxies) +} + func (cp *compatibleProvider) Touch() { cp.healthCheck.touch() } diff --git a/clash-meta/component/dialer/dialer.go b/clash-meta/component/dialer/dialer.go index 2a39508f3f..41f79b8e52 100644 --- a/clash-meta/component/dialer/dialer.go +++ b/clash-meta/component/dialer/dialer.go @@ -84,7 +84,7 @@ func ListenPacket(ctx context.Context, network, address string, rAddrPort netip. if cfg.addrReuse { addrReuseToListenConfig(lc) } - if DefaultSocketHook != nil { // ignore interfaceName, routingMark when DefaultSocketHook not null (in CFMA) + if DefaultSocketHook != nil { // ignore interfaceName, routingMark when DefaultSocketHook not null (in CMFA) socketHookToListenConfig(lc) } else { if cfg.interfaceName != "" { @@ -148,7 +148,7 @@ func dialContext(ctx context.Context, network string, destination netip.Addr, po setMultiPathTCP(dialer) } - if DefaultSocketHook != nil { // ignore interfaceName, routingMark and tfo when DefaultSocketHook not null (in CFMA) + if DefaultSocketHook != nil { // ignore interfaceName, routingMark and tfo when DefaultSocketHook not null (in CMFA) socketHookToToDialer(dialer) } else { if opt.interfaceName != "" { diff --git a/clash-meta/component/dialer/socket_hook.go b/clash-meta/component/dialer/socket_hook.go index 7a2ea43215..f860552579 100644 --- a/clash-meta/component/dialer/socket_hook.go +++ b/clash-meta/component/dialer/socket_hook.go @@ -7,11 +7,11 @@ import ( ) // SocketControl -// never change type traits because it's used in CFMA +// never change type traits because it's used in CMFA type SocketControl func(network, address string, conn syscall.RawConn) error // DefaultSocketHook -// never change type traits because it's used in CFMA +// never change type traits because it's used in CMFA var DefaultSocketHook SocketControl func socketHookToToDialer(dialer *net.Dialer) { diff --git a/clash-meta/component/fakeip/pool_test.go b/clash-meta/component/fakeip/pool_test.go index 923cca574d..ee607b68b4 100644 --- a/clash-meta/component/fakeip/pool_test.go +++ b/clash-meta/component/fakeip/pool_test.go @@ -63,13 +63,13 @@ func TestPool_Basic(t *testing.T) { last := pool.Lookup("bar.com") bar, exist := pool.LookBack(last) - assert.True(t, first == netip.AddrFrom4([4]byte{192, 168, 0, 4})) - assert.True(t, pool.Lookup("foo.com") == netip.AddrFrom4([4]byte{192, 168, 0, 4})) - assert.True(t, last == netip.AddrFrom4([4]byte{192, 168, 0, 5})) + assert.Equal(t, first, netip.AddrFrom4([4]byte{192, 168, 0, 4})) + assert.Equal(t, pool.Lookup("foo.com"), netip.AddrFrom4([4]byte{192, 168, 0, 4})) + assert.Equal(t, last, netip.AddrFrom4([4]byte{192, 168, 0, 5})) assert.True(t, exist) assert.Equal(t, bar, "bar.com") - assert.True(t, pool.Gateway() == netip.AddrFrom4([4]byte{192, 168, 0, 1})) - assert.True(t, pool.Broadcast() == netip.AddrFrom4([4]byte{192, 168, 0, 15})) + assert.Equal(t, pool.Gateway(), netip.AddrFrom4([4]byte{192, 168, 0, 1})) + assert.Equal(t, pool.Broadcast(), netip.AddrFrom4([4]byte{192, 168, 0, 15})) assert.Equal(t, pool.IPNet().String(), ipnet.String()) assert.True(t, pool.Exist(netip.AddrFrom4([4]byte{192, 168, 0, 5}))) assert.False(t, pool.Exist(netip.AddrFrom4([4]byte{192, 168, 0, 6}))) @@ -91,13 +91,13 @@ func TestPool_BasicV6(t *testing.T) { last := pool.Lookup("bar.com") bar, exist := pool.LookBack(last) - assert.True(t, first == netip.MustParseAddr("2001:4860:4860:0000:0000:0000:0000:8804")) - assert.True(t, pool.Lookup("foo.com") == netip.MustParseAddr("2001:4860:4860:0000:0000:0000:0000:8804")) - assert.True(t, last == netip.MustParseAddr("2001:4860:4860:0000:0000:0000:0000:8805")) + assert.Equal(t, first, netip.MustParseAddr("2001:4860:4860:0000:0000:0000:0000:8804")) + assert.Equal(t, pool.Lookup("foo.com"), netip.MustParseAddr("2001:4860:4860:0000:0000:0000:0000:8804")) + assert.Equal(t, last, netip.MustParseAddr("2001:4860:4860:0000:0000:0000:0000:8805")) assert.True(t, exist) assert.Equal(t, bar, "bar.com") - assert.True(t, pool.Gateway() == netip.MustParseAddr("2001:4860:4860:0000:0000:0000:0000:8801")) - assert.True(t, pool.Broadcast() == netip.MustParseAddr("2001:4860:4860:0000:0000:0000:0000:8bff")) + assert.Equal(t, pool.Gateway(), netip.MustParseAddr("2001:4860:4860:0000:0000:0000:0000:8801")) + assert.Equal(t, pool.Broadcast(), netip.MustParseAddr("2001:4860:4860:0000:0000:0000:0000:8bff")) assert.Equal(t, pool.IPNet().String(), ipnet.String()) assert.True(t, pool.Exist(netip.MustParseAddr("2001:4860:4860:0000:0000:0000:0000:8805"))) assert.False(t, pool.Exist(netip.MustParseAddr("2001:4860:4860:0000:0000:0000:0000:8806"))) @@ -143,8 +143,8 @@ func TestPool_CycleUsed(t *testing.T) { } baz := pool.Lookup("baz.com") next := pool.Lookup("foo.com") - assert.True(t, foo == baz) - assert.True(t, next == bar) + assert.Equal(t, foo, baz) + assert.Equal(t, next, bar) } } @@ -201,7 +201,7 @@ func TestPool_MaxCacheSize(t *testing.T) { pool.Lookup("baz.com") next := pool.Lookup("foo.com") - assert.False(t, first == next) + assert.NotEqual(t, first, next) } func TestPool_DoubleMapping(t *testing.T) { @@ -231,7 +231,7 @@ func TestPool_DoubleMapping(t *testing.T) { assert.False(t, bazExist) assert.True(t, barExist) - assert.False(t, bazIP == newBazIP) + assert.NotEqual(t, bazIP, newBazIP) } func TestPool_Clone(t *testing.T) { @@ -243,8 +243,8 @@ func TestPool_Clone(t *testing.T) { first := pool.Lookup("foo.com") last := pool.Lookup("bar.com") - assert.True(t, first == netip.AddrFrom4([4]byte{192, 168, 0, 4})) - assert.True(t, last == netip.AddrFrom4([4]byte{192, 168, 0, 5})) + assert.Equal(t, first, netip.AddrFrom4([4]byte{192, 168, 0, 4})) + assert.Equal(t, last, netip.AddrFrom4([4]byte{192, 168, 0, 5})) newPool, _ := New(Options{ IPNet: ipnet, @@ -289,13 +289,13 @@ func TestPool_FlushFileCache(t *testing.T) { baz := pool.Lookup("foo.com") nero := pool.Lookup("foo.com") - assert.True(t, foo == fox) - assert.True(t, foo == next) - assert.False(t, foo == baz) - assert.True(t, bar == bax) - assert.True(t, bar == baz) - assert.False(t, bar == next) - assert.True(t, baz == nero) + assert.Equal(t, foo, fox) + assert.Equal(t, foo, next) + assert.NotEqual(t, foo, baz) + assert.Equal(t, bar, bax) + assert.Equal(t, bar, baz) + assert.NotEqual(t, bar, next) + assert.Equal(t, baz, nero) } } @@ -318,11 +318,11 @@ func TestPool_FlushMemoryCache(t *testing.T) { baz := pool.Lookup("foo.com") nero := pool.Lookup("foo.com") - assert.True(t, foo == fox) - assert.True(t, foo == next) - assert.False(t, foo == baz) - assert.True(t, bar == bax) - assert.True(t, bar == baz) - assert.False(t, bar == next) - assert.True(t, baz == nero) + assert.Equal(t, foo, fox) + assert.Equal(t, foo, next) + assert.NotEqual(t, foo, baz) + assert.Equal(t, bar, bax) + assert.Equal(t, bar, baz) + assert.NotEqual(t, bar, next) + assert.Equal(t, baz, nero) } diff --git a/clash-meta/component/geodata/init.go b/clash-meta/component/geodata/init.go index 834567a447..08ec1b948d 100644 --- a/clash-meta/component/geodata/init.go +++ b/clash-meta/component/geodata/init.go @@ -6,8 +6,10 @@ import ( "io" "net/http" "os" + "sync" "time" + "github.com/metacubex/mihomo/common/atomic" mihomoHttp "github.com/metacubex/mihomo/component/http" "github.com/metacubex/mihomo/component/mmdb" C "github.com/metacubex/mihomo/constant" @@ -18,12 +20,79 @@ var ( initGeoSite bool initGeoIP int initASN bool + + initGeoSiteMutex sync.Mutex + initGeoIPMutex sync.Mutex + initASNMutex sync.Mutex + + geoIpEnable atomic.Bool + geoSiteEnable atomic.Bool + asnEnable atomic.Bool + + geoIpUrl string + mmdbUrl string + geoSiteUrl string + asnUrl string ) +func GeoIpUrl() string { + return geoIpUrl +} + +func SetGeoIpUrl(url string) { + geoIpUrl = url +} + +func MmdbUrl() string { + return mmdbUrl +} + +func SetMmdbUrl(url string) { + mmdbUrl = url +} + +func GeoSiteUrl() string { + return geoSiteUrl +} + +func SetGeoSiteUrl(url string) { + geoSiteUrl = url +} + +func ASNUrl() string { + return asnUrl +} + +func SetASNUrl(url string) { + asnUrl = url +} + +func downloadToPath(url string, path string) (err error) { + ctx, cancel := context.WithTimeout(context.Background(), time.Second*90) + defer cancel() + resp, err := mihomoHttp.HttpRequest(ctx, url, http.MethodGet, nil, nil) + if err != nil { + return + } + defer resp.Body.Close() + + f, err := os.OpenFile(path, os.O_CREATE|os.O_WRONLY, 0o644) + if err != nil { + return err + } + defer f.Close() + _, err = io.Copy(f, resp.Body) + + return err +} + func InitGeoSite() error { + geoSiteEnable.Store(true) + initGeoSiteMutex.Lock() + defer initGeoSiteMutex.Unlock() if _, err := os.Stat(C.Path.GeoSite()); os.IsNotExist(err) { log.Infoln("Can't find GeoSite.dat, start download") - if err := downloadGeoSite(C.Path.GeoSite()); err != nil { + if err := downloadToPath(GeoSiteUrl(), C.Path.GeoSite()); err != nil { return fmt.Errorf("can't download GeoSite.dat: %s", err.Error()) } log.Infoln("Download GeoSite.dat finish") @@ -35,7 +104,7 @@ func InitGeoSite() error { if err := os.Remove(C.Path.GeoSite()); err != nil { return fmt.Errorf("can't remove invalid GeoSite.dat: %s", err.Error()) } - if err := downloadGeoSite(C.Path.GeoSite()); err != nil { + if err := downloadToPath(GeoSiteUrl(), C.Path.GeoSite()); err != nil { return fmt.Errorf("can't download GeoSite.dat: %s", err.Error()) } } @@ -44,49 +113,14 @@ func InitGeoSite() error { return nil } -func downloadGeoSite(path string) (err error) { - ctx, cancel := context.WithTimeout(context.Background(), time.Second*90) - defer cancel() - resp, err := mihomoHttp.HttpRequest(ctx, C.GeoSiteUrl, http.MethodGet, http.Header{"User-Agent": {C.UA}}, nil) - if err != nil { - return - } - defer resp.Body.Close() - - f, err := os.OpenFile(path, os.O_CREATE|os.O_WRONLY, 0o644) - if err != nil { - return err - } - defer f.Close() - _, err = io.Copy(f, resp.Body) - - return err -} - -func downloadGeoIP(path string) (err error) { - ctx, cancel := context.WithTimeout(context.Background(), time.Second*90) - defer cancel() - resp, err := mihomoHttp.HttpRequest(ctx, C.GeoIpUrl, http.MethodGet, http.Header{"User-Agent": {C.UA}}, nil) - if err != nil { - return - } - defer resp.Body.Close() - - f, err := os.OpenFile(path, os.O_CREATE|os.O_WRONLY, 0o644) - if err != nil { - return err - } - defer f.Close() - _, err = io.Copy(f, resp.Body) - - return err -} - func InitGeoIP() error { - if C.GeodataMode { + geoIpEnable.Store(true) + initGeoIPMutex.Lock() + defer initGeoIPMutex.Unlock() + if GeodataMode() { if _, err := os.Stat(C.Path.GeoIP()); os.IsNotExist(err) { log.Infoln("Can't find GeoIP.dat, start download") - if err := downloadGeoIP(C.Path.GeoIP()); err != nil { + if err := downloadToPath(GeoIpUrl(), C.Path.GeoIP()); err != nil { return fmt.Errorf("can't download GeoIP.dat: %s", err.Error()) } log.Infoln("Download GeoIP.dat finish") @@ -99,7 +133,7 @@ func InitGeoIP() error { if err := os.Remove(C.Path.GeoIP()); err != nil { return fmt.Errorf("can't remove invalid GeoIP.dat: %s", err.Error()) } - if err := downloadGeoIP(C.Path.GeoIP()); err != nil { + if err := downloadToPath(GeoIpUrl(), C.Path.GeoIP()); err != nil { return fmt.Errorf("can't download GeoIP.dat: %s", err.Error()) } } @@ -110,7 +144,7 @@ func InitGeoIP() error { if _, err := os.Stat(C.Path.MMDB()); os.IsNotExist(err) { log.Infoln("Can't find MMDB, start download") - if err := mmdb.DownloadMMDB(C.Path.MMDB()); err != nil { + if err := downloadToPath(MmdbUrl(), C.Path.MMDB()); err != nil { return fmt.Errorf("can't download MMDB: %s", err.Error()) } } @@ -121,7 +155,7 @@ func InitGeoIP() error { if err := os.Remove(C.Path.MMDB()); err != nil { return fmt.Errorf("can't remove invalid MMDB: %s", err.Error()) } - if err := mmdb.DownloadMMDB(C.Path.MMDB()); err != nil { + if err := downloadToPath(MmdbUrl(), C.Path.MMDB()); err != nil { return fmt.Errorf("can't download MMDB: %s", err.Error()) } } @@ -131,9 +165,12 @@ func InitGeoIP() error { } func InitASN() error { + asnEnable.Store(true) + initASNMutex.Lock() + defer initASNMutex.Unlock() if _, err := os.Stat(C.Path.ASN()); os.IsNotExist(err) { log.Infoln("Can't find ASN.mmdb, start download") - if err := mmdb.DownloadASN(C.Path.ASN()); err != nil { + if err := downloadToPath(ASNUrl(), C.Path.ASN()); err != nil { return fmt.Errorf("can't download ASN.mmdb: %s", err.Error()) } log.Infoln("Download ASN.mmdb finish") @@ -145,7 +182,7 @@ func InitASN() error { if err := os.Remove(C.Path.ASN()); err != nil { return fmt.Errorf("can't remove invalid ASN: %s", err.Error()) } - if err := mmdb.DownloadASN(C.Path.ASN()); err != nil { + if err := downloadToPath(ASNUrl(), C.Path.ASN()); err != nil { return fmt.Errorf("can't download ASN: %s", err.Error()) } } @@ -153,3 +190,15 @@ func InitASN() error { } return nil } + +func GeoIpEnable() bool { + return geoIpEnable.Load() +} + +func GeoSiteEnable() bool { + return geoSiteEnable.Load() +} + +func ASNEnable() bool { + return asnEnable.Load() +} diff --git a/clash-meta/component/geodata/utils.go b/clash-meta/component/geodata/utils.go index a16e255e14..4796624966 100644 --- a/clash-meta/component/geodata/utils.go +++ b/clash-meta/component/geodata/utils.go @@ -13,8 +13,6 @@ import ( var ( geoMode bool - AutoUpdate bool - UpdateInterval int geoLoaderName = "memconservative" geoSiteMatcher = "succinct" ) @@ -25,14 +23,6 @@ func GeodataMode() bool { return geoMode } -func GeoAutoUpdate() bool { - return AutoUpdate -} - -func GeoUpdateInterval() int { - return UpdateInterval -} - func LoaderName() string { return geoLoaderName } @@ -44,12 +34,6 @@ func SiteMatcherName() string { func SetGeodataMode(newGeodataMode bool) { geoMode = newGeodataMode } -func SetGeoAutoUpdate(newAutoUpdate bool) { - AutoUpdate = newAutoUpdate -} -func SetGeoUpdateInterval(newGeoUpdateInterval int) { - UpdateInterval = newGeoUpdateInterval -} func SetLoader(newLoader string) { if newLoader == "memc" { @@ -209,8 +193,11 @@ func LoadGeoIPMatcher(country string) (router.IPMatcher, error) { return matcher, nil } -func ClearCache() { +func ClearGeoSiteCache() { loadGeoSiteMatcherListSF.Reset() loadGeoSiteMatcherSF.Reset() +} + +func ClearGeoIPCache() { loadGeoIPMatcherSF.Reset() } diff --git a/clash-meta/component/http/http.go b/clash-meta/component/http/http.go index 21d65d2e96..3fc06da3cb 100644 --- a/clash-meta/component/http/http.go +++ b/clash-meta/component/http/http.go @@ -12,10 +12,21 @@ import ( "time" "github.com/metacubex/mihomo/component/ca" - C "github.com/metacubex/mihomo/constant" "github.com/metacubex/mihomo/listener/inner" ) +var ( + ua string +) + +func UA() string { + return ua +} + +func SetUA(UA string) { + ua = UA +} + func HttpRequest(ctx context.Context, url, method string, header map[string][]string, body io.Reader) (*http.Response, error) { return HttpRequestWithProxy(ctx, url, method, header, body, "") } @@ -35,7 +46,7 @@ func HttpRequestWithProxy(ctx context.Context, url, method string, header map[st } if _, ok := header["User-Agent"]; !ok { - req.Header.Set("User-Agent", C.UA) + req.Header.Set("User-Agent", UA()) } if err != nil { diff --git a/clash-meta/component/mmdb/mmdb.go b/clash-meta/component/mmdb/mmdb.go index 81156bc62d..81644b0076 100644 --- a/clash-meta/component/mmdb/mmdb.go +++ b/clash-meta/component/mmdb/mmdb.go @@ -1,15 +1,9 @@ package mmdb import ( - "context" - "io" - "net/http" - "os" "sync" - "time" mihomoOnce "github.com/metacubex/mihomo/common/once" - mihomoHttp "github.com/metacubex/mihomo/component/http" C "github.com/metacubex/mihomo/constant" "github.com/metacubex/mihomo/log" @@ -25,26 +19,26 @@ const ( ) var ( - IPreader IPReader - ASNreader ASNReader - IPonce sync.Once - ASNonce sync.Once + ipReader IPReader + asnReader ASNReader + ipOnce sync.Once + asnOnce sync.Once ) func LoadFromBytes(buffer []byte) { - IPonce.Do(func() { + ipOnce.Do(func() { mmdb, err := maxminddb.FromBytes(buffer) if err != nil { log.Fatalln("Can't load mmdb: %s", err.Error()) } - IPreader = IPReader{Reader: mmdb} + ipReader = IPReader{Reader: mmdb} switch mmdb.Metadata.DatabaseType { case "sing-geoip": - IPreader.databaseType = typeSing + ipReader.databaseType = typeSing case "Meta-geoip0": - IPreader.databaseType = typeMetaV0 + ipReader.databaseType = typeMetaV0 default: - IPreader.databaseType = typeMaxmind + ipReader.databaseType = typeMaxmind } }) } @@ -58,83 +52,45 @@ func Verify(path string) bool { } func IPInstance() IPReader { - IPonce.Do(func() { + ipOnce.Do(func() { mmdbPath := C.Path.MMDB() log.Infoln("Load MMDB file: %s", mmdbPath) mmdb, err := maxminddb.Open(mmdbPath) if err != nil { log.Fatalln("Can't load MMDB: %s", err.Error()) } - IPreader = IPReader{Reader: mmdb} + ipReader = IPReader{Reader: mmdb} switch mmdb.Metadata.DatabaseType { case "sing-geoip": - IPreader.databaseType = typeSing + ipReader.databaseType = typeSing case "Meta-geoip0": - IPreader.databaseType = typeMetaV0 + ipReader.databaseType = typeMetaV0 default: - IPreader.databaseType = typeMaxmind + ipReader.databaseType = typeMaxmind } }) - return IPreader -} - -func DownloadMMDB(path string) (err error) { - ctx, cancel := context.WithTimeout(context.Background(), time.Second*90) - defer cancel() - resp, err := mihomoHttp.HttpRequest(ctx, C.MmdbUrl, http.MethodGet, http.Header{"User-Agent": {C.UA}}, nil) - if err != nil { - return - } - defer resp.Body.Close() - - f, err := os.OpenFile(path, os.O_CREATE|os.O_WRONLY, 0o644) - if err != nil { - return err - } - defer f.Close() - _, err = io.Copy(f, resp.Body) - - return err + return ipReader } func ASNInstance() ASNReader { - ASNonce.Do(func() { + asnOnce.Do(func() { ASNPath := C.Path.ASN() log.Infoln("Load ASN file: %s", ASNPath) asn, err := maxminddb.Open(ASNPath) if err != nil { log.Fatalln("Can't load ASN: %s", err.Error()) } - ASNreader = ASNReader{Reader: asn} + asnReader = ASNReader{Reader: asn} }) - return ASNreader -} - -func DownloadASN(path string) (err error) { - ctx, cancel := context.WithTimeout(context.Background(), time.Second*90) - defer cancel() - resp, err := mihomoHttp.HttpRequest(ctx, C.ASNUrl, http.MethodGet, http.Header{"User-Agent": {C.UA}}, nil) - if err != nil { - return - } - defer resp.Body.Close() - - f, err := os.OpenFile(path, os.O_CREATE|os.O_WRONLY, 0o644) - if err != nil { - return err - } - defer f.Close() - _, err = io.Copy(f, resp.Body) - - return err + return asnReader } func ReloadIP() { - mihomoOnce.Reset(&IPonce) + mihomoOnce.Reset(&ipOnce) } func ReloadASN() { - mihomoOnce.Reset(&ASNonce) + mihomoOnce.Reset(&asnOnce) } diff --git a/clash-meta/component/mmdb/patch_android.go b/clash-meta/component/mmdb/patch_android.go index 147a332434..dfa96cacbd 100644 --- a/clash-meta/component/mmdb/patch_android.go +++ b/clash-meta/component/mmdb/patch_android.go @@ -8,11 +8,11 @@ func InstallOverride(override *maxminddb.Reader) { newReader := IPReader{Reader: override} switch override.Metadata.DatabaseType { case "sing-geoip": - IPreader.databaseType = typeSing + ipReader.databaseType = typeSing case "Meta-geoip0": - IPreader.databaseType = typeMetaV0 + ipReader.databaseType = typeMetaV0 default: - IPreader.databaseType = typeMaxmind + ipReader.databaseType = typeMaxmind } - IPreader = newReader + ipReader = newReader } diff --git a/clash-meta/component/process/process.go b/clash-meta/component/process/process.go index 84020c4d38..464f5a79bc 100644 --- a/clash-meta/component/process/process.go +++ b/clash-meta/component/process/process.go @@ -23,11 +23,11 @@ func FindProcessName(network string, srcIP netip.Addr, srcPort int) (uint32, str } // PackageNameResolver -// never change type traits because it's used in CFMA +// never change type traits because it's used in CMFA type PackageNameResolver func(metadata *C.Metadata) (string, error) // DefaultPackageNameResolver -// never change type traits because it's used in CFMA +// never change type traits because it's used in CMFA var DefaultPackageNameResolver PackageNameResolver func FindPackageName(metadata *C.Metadata) (string, error) { diff --git a/clash-meta/component/updater/update_core.go b/clash-meta/component/updater/update_core.go index 9f13af9ca5..2aab7833ea 100644 --- a/clash-meta/component/updater/update_core.go +++ b/clash-meta/component/updater/update_core.go @@ -237,7 +237,7 @@ const MaxPackageFileSize = 32 * 1024 * 1024 func downloadPackageFile() (err error) { ctx, cancel := context.WithTimeout(context.Background(), time.Second*90) defer cancel() - resp, err := mihomoHttp.HttpRequest(ctx, packageURL, http.MethodGet, http.Header{"User-Agent": {C.UA}}, nil) + resp, err := mihomoHttp.HttpRequest(ctx, packageURL, http.MethodGet, nil, nil) if err != nil { return fmt.Errorf("http request failed: %w", err) } @@ -418,7 +418,7 @@ func copyFile(src, dst string) error { func getLatestVersion() (version string, err error) { ctx, cancel := context.WithTimeout(context.Background(), time.Second*5) defer cancel() - resp, err := mihomoHttp.HttpRequest(ctx, versionURL, http.MethodGet, http.Header{"User-Agent": {C.UA}}, nil) + resp, err := mihomoHttp.HttpRequest(ctx, versionURL, http.MethodGet, nil, nil) if err != nil { return "", fmt.Errorf("get Latest Version fail: %w", err) } diff --git a/clash-meta/component/updater/update_geo.go b/clash-meta/component/updater/update_geo.go index 4d16c12874..6246b1c669 100644 --- a/clash-meta/component/updater/update_geo.go +++ b/clash-meta/component/updater/update_geo.go @@ -1,6 +1,7 @@ package updater import ( + "context" "errors" "fmt" "os" @@ -8,6 +9,7 @@ import ( "time" "github.com/metacubex/mihomo/common/atomic" + "github.com/metacubex/mihomo/common/batch" "github.com/metacubex/mihomo/component/geodata" _ "github.com/metacubex/mihomo/component/geodata/standard" "github.com/metacubex/mihomo/component/mmdb" @@ -18,69 +20,87 @@ import ( ) var ( - UpdatingGeo atomic.Bool + autoUpdate bool + updateInterval int + + updatingGeo atomic.Bool ) -func updateGeoDatabases() error { - defer runtime.GC() - geoLoader, err := geodata.GetGeoDataLoader("standard") +func GeoAutoUpdate() bool { + return autoUpdate +} + +func GeoUpdateInterval() int { + return updateInterval +} + +func SetGeoAutoUpdate(newAutoUpdate bool) { + autoUpdate = newAutoUpdate +} + +func SetGeoUpdateInterval(newGeoUpdateInterval int) { + updateInterval = newGeoUpdateInterval +} + +func UpdateMMDB() (err error) { + defer mmdb.ReloadIP() + data, err := downloadForBytes(geodata.MmdbUrl()) if err != nil { - return err + return fmt.Errorf("can't download MMDB database file: %w", err) + } + instance, err := maxminddb.FromBytes(data) + if err != nil { + return fmt.Errorf("invalid MMDB database file: %s", err) + } + _ = instance.Close() + + mmdb.IPInstance().Reader.Close() // mmdb is loaded with mmap, so it needs to be closed before overwriting the file + if err = saveFile(data, C.Path.MMDB()); err != nil { + return fmt.Errorf("can't save MMDB database file: %w", err) + } + return nil +} + +func UpdateASN() (err error) { + defer mmdb.ReloadASN() + data, err := downloadForBytes(geodata.ASNUrl()) + if err != nil { + return fmt.Errorf("can't download ASN database file: %w", err) } - if C.GeodataMode { - data, err := downloadForBytes(C.GeoIpUrl) - if err != nil { - return fmt.Errorf("can't download GeoIP database file: %w", err) - } - - if _, err = geoLoader.LoadIPByBytes(data, "cn"); err != nil { - return fmt.Errorf("invalid GeoIP database file: %s", err) - } - - if err = saveFile(data, C.Path.GeoIP()); err != nil { - return fmt.Errorf("can't save GeoIP database file: %w", err) - } - - } else { - defer mmdb.ReloadIP() - data, err := downloadForBytes(C.MmdbUrl) - if err != nil { - return fmt.Errorf("can't download MMDB database file: %w", err) - } - - instance, err := maxminddb.FromBytes(data) - if err != nil { - return fmt.Errorf("invalid MMDB database file: %s", err) - } - _ = instance.Close() - - mmdb.IPInstance().Reader.Close() // mmdb is loaded with mmap, so it needs to be closed before overwriting the file - if err = saveFile(data, C.Path.MMDB()); err != nil { - return fmt.Errorf("can't save MMDB database file: %w", err) - } + instance, err := maxminddb.FromBytes(data) + if err != nil { + return fmt.Errorf("invalid ASN database file: %s", err) } + _ = instance.Close() - if C.ASNEnable { - defer mmdb.ReloadASN() - data, err := downloadForBytes(C.ASNUrl) - if err != nil { - return fmt.Errorf("can't download ASN database file: %w", err) - } - - instance, err := maxminddb.FromBytes(data) - if err != nil { - return fmt.Errorf("invalid ASN database file: %s", err) - } - _ = instance.Close() - - mmdb.ASNInstance().Reader.Close() - if err = saveFile(data, C.Path.ASN()); err != nil { - return fmt.Errorf("can't save ASN database file: %w", err) - } + mmdb.ASNInstance().Reader.Close() // mmdb is loaded with mmap, so it needs to be closed before overwriting the file + if err = saveFile(data, C.Path.ASN()); err != nil { + return fmt.Errorf("can't save ASN database file: %w", err) } + return nil +} - data, err := downloadForBytes(C.GeoSiteUrl) +func UpdateGeoIp() (err error) { + defer geodata.ClearGeoIPCache() + geoLoader, err := geodata.GetGeoDataLoader("standard") + data, err := downloadForBytes(geodata.GeoIpUrl()) + if err != nil { + return fmt.Errorf("can't download GeoIP database file: %w", err) + } + if _, err = geoLoader.LoadIPByBytes(data, "cn"); err != nil { + return fmt.Errorf("invalid GeoIP database file: %s", err) + } + if err = saveFile(data, C.Path.GeoIP()); err != nil { + return fmt.Errorf("can't save GeoIP database file: %w", err) + } + return nil +} + +func UpdateGeoSite() (err error) { + defer geodata.ClearGeoSiteCache() + geoLoader, err := geodata.GetGeoDataLoader("standard") + data, err := downloadForBytes(geodata.GeoSiteUrl()) if err != nil { return fmt.Errorf("can't download GeoSite database file: %w", err) } @@ -92,8 +112,45 @@ func updateGeoDatabases() error { if err = saveFile(data, C.Path.GeoSite()); err != nil { return fmt.Errorf("can't save GeoSite database file: %w", err) } + return nil +} - geodata.ClearCache() +func updateGeoDatabases() error { + defer runtime.GC() + + b, _ := batch.New[interface{}](context.Background()) + + if geodata.GeoIpEnable() { + if geodata.GeodataMode() { + b.Go("UpdateGeoIp", func() (_ interface{}, err error) { + err = UpdateGeoIp() + return + }) + } else { + b.Go("UpdateMMDB", func() (_ interface{}, err error) { + err = UpdateMMDB() + return + }) + } + } + + if geodata.ASNEnable() { + b.Go("UpdateASN", func() (_ interface{}, err error) { + err = UpdateASN() + return + }) + } + + if geodata.GeoSiteEnable() { + b.Go("UpdateGeoSite", func() (_ interface{}, err error) { + err = UpdateGeoSite() + return + }) + } + + if e := b.Wait(); e != nil { + return e.Err + } return nil } @@ -103,12 +160,12 @@ var ErrGetDatabaseUpdateSkip = errors.New("GEO database is updating, skip") func UpdateGeoDatabases() error { log.Infoln("[GEO] Start updating GEO database") - if UpdatingGeo.Load() { + if updatingGeo.Load() { return ErrGetDatabaseUpdateSkip } - UpdatingGeo.Store(true) - defer UpdatingGeo.Store(false) + updatingGeo.Store(true) + defer updatingGeo.Store(false) log.Infoln("[GEO] Updating GEO database") @@ -122,7 +179,7 @@ func UpdateGeoDatabases() error { func getUpdateTime() (err error, time time.Time) { var fileInfo os.FileInfo - if C.GeodataMode { + if geodata.GeodataMode() { fileInfo, err = os.Stat(C.Path.GeoIP()) if err != nil { return err, time @@ -138,13 +195,13 @@ func getUpdateTime() (err error, time time.Time) { } func RegisterGeoUpdater() { - if C.GeoUpdateInterval <= 0 { - log.Errorln("[GEO] Invalid update interval: %d", C.GeoUpdateInterval) + if updateInterval <= 0 { + log.Errorln("[GEO] Invalid update interval: %d", updateInterval) return } go func() { - ticker := time.NewTicker(time.Duration(C.GeoUpdateInterval) * time.Hour) + ticker := time.NewTicker(time.Duration(updateInterval) * time.Hour) defer ticker.Stop() err, lastUpdate := getUpdateTime() @@ -154,8 +211,8 @@ func RegisterGeoUpdater() { } log.Infoln("[GEO] last update time %s", lastUpdate) - if lastUpdate.Add(time.Duration(C.GeoUpdateInterval) * time.Hour).Before(time.Now()) { - log.Infoln("[GEO] Database has not been updated for %v, update now", time.Duration(C.GeoUpdateInterval)*time.Hour) + if lastUpdate.Add(time.Duration(updateInterval) * time.Hour).Before(time.Now()) { + log.Infoln("[GEO] Database has not been updated for %v, update now", time.Duration(updateInterval)*time.Hour) if err := UpdateGeoDatabases(); err != nil { log.Errorln("[GEO] Failed to update GEO database: %s", err.Error()) return @@ -163,7 +220,7 @@ func RegisterGeoUpdater() { } for range ticker.C { - log.Infoln("[GEO] updating database every %d hours", C.GeoUpdateInterval) + log.Infoln("[GEO] updating database every %d hours", updateInterval) if err := UpdateGeoDatabases(); err != nil { log.Errorln("[GEO] Failed to update GEO database: %s", err.Error()) } diff --git a/clash-meta/component/updater/utils.go b/clash-meta/component/updater/utils.go index 0eecfc6cdc..d9da48c31b 100644 --- a/clash-meta/component/updater/utils.go +++ b/clash-meta/component/updater/utils.go @@ -9,7 +9,6 @@ import ( "time" mihomoHttp "github.com/metacubex/mihomo/component/http" - C "github.com/metacubex/mihomo/constant" "golang.org/x/exp/constraints" ) @@ -17,7 +16,7 @@ import ( func downloadForBytes(url string) ([]byte, error) { ctx, cancel := context.WithTimeout(context.Background(), time.Second*90) defer cancel() - resp, err := mihomoHttp.HttpRequest(ctx, url, http.MethodGet, http.Header{"User-Agent": {C.UA}}, nil) + resp, err := mihomoHttp.HttpRequest(ctx, url, http.MethodGet, nil, nil) if err != nil { return nil, err } diff --git a/clash-meta/config/config.go b/clash-meta/config/config.go index 4490ebf6b2..26518758ef 100644 --- a/clash-meta/config/config.go +++ b/clash-meta/config/config.go @@ -22,6 +22,7 @@ import ( "github.com/metacubex/mihomo/component/cidr" "github.com/metacubex/mihomo/component/fakeip" "github.com/metacubex/mihomo/component/geodata" + mihomoHttp "github.com/metacubex/mihomo/component/http" P "github.com/metacubex/mihomo/component/process" "github.com/metacubex/mihomo/component/resolver" "github.com/metacubex/mihomo/component/sniffer" @@ -433,7 +434,7 @@ func DefaultRawConfig() *RawConfig { Mode: T.Rule, GeoAutoUpdate: false, GeoUpdateInterval: 24, - GeodataMode: C.GeodataMode, + GeodataMode: geodata.GeodataMode(), GeodataLoader: "memconservative", UnifiedDelay: false, Authentication: []string{}, @@ -681,19 +682,16 @@ func ParseRawConfig(rawCfg *RawConfig) (*Config, error) { } func parseGeneral(cfg *RawConfig) (*General, error) { + updater.SetGeoAutoUpdate(cfg.GeoAutoUpdate) + updater.SetGeoUpdateInterval(cfg.GeoUpdateInterval) geodata.SetGeodataMode(cfg.GeodataMode) - geodata.SetGeoAutoUpdate(cfg.GeoAutoUpdate) - geodata.SetGeoUpdateInterval(cfg.GeoUpdateInterval) geodata.SetLoader(cfg.GeodataLoader) geodata.SetSiteMatcher(cfg.GeositeMatcher) - C.GeoAutoUpdate = cfg.GeoAutoUpdate - C.GeoUpdateInterval = cfg.GeoUpdateInterval - C.GeoIpUrl = cfg.GeoXUrl.GeoIp - C.GeoSiteUrl = cfg.GeoXUrl.GeoSite - C.MmdbUrl = cfg.GeoXUrl.Mmdb - C.ASNUrl = cfg.GeoXUrl.ASN - C.GeodataMode = cfg.GeodataMode - C.UA = cfg.GlobalUA + geodata.SetGeoIpUrl(cfg.GeoXUrl.GeoIp) + geodata.SetGeoSiteUrl(cfg.GeoXUrl.GeoSite) + geodata.SetMmdbUrl(cfg.GeoXUrl.Mmdb) + geodata.SetASNUrl(cfg.GeoXUrl.ASN) + mihomoHttp.SetUA(cfg.GlobalUA) if cfg.KeepAliveIdle != 0 { N.KeepAliveIdle = time.Duration(cfg.KeepAliveIdle) * time.Second diff --git a/clash-meta/constant/geodata.go b/clash-meta/constant/geodata.go deleted file mode 100644 index cd3f74e30c..0000000000 --- a/clash-meta/constant/geodata.go +++ /dev/null @@ -1,12 +0,0 @@ -package constant - -var ( - ASNEnable bool - GeodataMode bool - GeoAutoUpdate bool - GeoUpdateInterval int - GeoIpUrl string - MmdbUrl string - GeoSiteUrl string - ASNUrl string -) diff --git a/clash-meta/constant/http.go b/clash-meta/constant/http.go deleted file mode 100644 index 8e321f6bb0..0000000000 --- a/clash-meta/constant/http.go +++ /dev/null @@ -1,5 +0,0 @@ -package constant - -var ( - UA string -) diff --git a/clash-meta/constant/provider/interface.go b/clash-meta/constant/provider/interface.go index 911f774a62..880bdadff6 100644 --- a/clash-meta/constant/provider/interface.go +++ b/clash-meta/constant/provider/interface.go @@ -71,6 +71,7 @@ type Provider interface { type ProxyProvider interface { Provider Proxies() []constant.Proxy + Count() int // Touch is used to inform the provider that the proxy is actually being used while getting the list of proxies. // Commonly used in DialContext and DialPacketConn Touch() diff --git a/clash-meta/docs/config.yaml b/clash-meta/docs/config.yaml index 1da37841cb..78e62d1280 100644 --- a/clash-meta/docs/config.yaml +++ b/clash-meta/docs/config.yaml @@ -955,12 +955,12 @@ rule-providers: # 对于behavior=domain: # - format=yaml 可以通过“mihomo convert-ruleset domain yaml XXX.yaml XXX.mrs”转换到mrs格式 # - format=text 可以通过“mihomo convert-ruleset domain text XXX.text XXX.mrs”转换到mrs格式 - # - XXX.mrs 可以通过"mihomo convert-ruleset domain mrs XXX.mrs XXX.text"转换回text格式(暂不支持转换回ymal格式) + # - XXX.mrs 可以通过"mihomo convert-ruleset domain mrs XXX.mrs XXX.text"转换回text格式(暂不支持转换回yaml格式) # # 对于behavior=ipcidr: # - format=yaml 可以通过“mihomo convert-ruleset ipcidr yaml XXX.yaml XXX.mrs”转换到mrs格式 # - format=text 可以通过“mihomo convert-ruleset ipcidr text XXX.text XXX.mrs”转换到mrs格式 - # - XXX.mrs 可以通过"mihomo convert-ruleset ipcidr mrs XXX.mrs XXX.text"转换回text格式(暂不支持转换回ymal格式) + # - XXX.mrs 可以通过"mihomo convert-ruleset ipcidr mrs XXX.mrs XXX.text"转换回text格式(暂不支持转换回yaml格式) # type: http url: "url" diff --git a/clash-meta/go.mod b/clash-meta/go.mod index 75aea3f03a..7121901bbb 100644 --- a/clash-meta/go.mod +++ b/clash-meta/go.mod @@ -20,7 +20,7 @@ require ( github.com/metacubex/bbolt v0.0.0-20240822011022-aed6d4850399 github.com/metacubex/chacha v0.1.0 github.com/metacubex/gopacket v1.1.20-0.20230608035415-7e2f98a3e759 - github.com/metacubex/quic-go v0.46.1-0.20240807232329-1c6cb2d67f58 + github.com/metacubex/quic-go v0.47.1-0.20240909010619-6b38f24bfcc4 github.com/metacubex/randv2 v0.2.0 github.com/metacubex/sing-quic v0.0.0-20240827003841-cd97758ed8b4 github.com/metacubex/sing-shadowsocks v0.2.8 diff --git a/clash-meta/go.sum b/clash-meta/go.sum index 40ca026404..3b1d2b5025 100644 --- a/clash-meta/go.sum +++ b/clash-meta/go.sum @@ -104,8 +104,8 @@ github.com/metacubex/gopacket v1.1.20-0.20230608035415-7e2f98a3e759 h1:cjd4biTvO github.com/metacubex/gopacket v1.1.20-0.20230608035415-7e2f98a3e759/go.mod h1:UHOv2xu+RIgLwpXca7TLrXleEd4oR3sPatW6IF8wU88= github.com/metacubex/gvisor v0.0.0-20240320004321-933faba989ec h1:HxreOiFTUrJXJautEo8rnE1uKTVGY8wtZepY1Tii/Nc= github.com/metacubex/gvisor v0.0.0-20240320004321-933faba989ec/go.mod h1:8BVmQ+3cxjqzWElafm24rb2Ae4jRI6vAXNXWqWjfrXw= -github.com/metacubex/quic-go v0.46.1-0.20240807232329-1c6cb2d67f58 h1:T6OxROLZBr9SOQxN5TzUslv81hEREy/dEgaUKVjaG7U= -github.com/metacubex/quic-go v0.46.1-0.20240807232329-1c6cb2d67f58/go.mod h1:Yza2H7Ax1rxWPUcJx0vW+oAt9EsPuSiyQFhFabUPzwU= +github.com/metacubex/quic-go v0.47.1-0.20240909010619-6b38f24bfcc4 h1:CgdUBRxmNlxEGkp35HwvgQ10jwOOUJKWdOxpi8yWi8o= +github.com/metacubex/quic-go v0.47.1-0.20240909010619-6b38f24bfcc4/go.mod h1:Y7yRGqFE6UQL/3aKPYmiYdjfVkeujJaStP4+jiZMcN8= github.com/metacubex/randv2 v0.2.0 h1:uP38uBvV2SxYfLj53kuvAjbND4RUDfFJjwr4UigMiLs= github.com/metacubex/randv2 v0.2.0/go.mod h1:kFi2SzrQ5WuneuoLLCMkABtiBu6VRrMrWFqSPyj2cxY= github.com/metacubex/sing v0.0.0-20240724044459-6f3cf5896297 h1:YG/JkwGPbca5rUtEMHIu8ZuqzR7BSVm1iqY8hNoMeMA= diff --git a/clash-meta/hub/executor/executor.go b/clash-meta/hub/executor/executor.go index c83b254c96..fddcc42efa 100644 --- a/clash-meta/hub/executor/executor.go +++ b/clash-meta/hub/executor/executor.go @@ -17,6 +17,7 @@ import ( "github.com/metacubex/mihomo/component/ca" "github.com/metacubex/mihomo/component/dialer" G "github.com/metacubex/mihomo/component/geodata" + mihomoHttp "github.com/metacubex/mihomo/component/http" "github.com/metacubex/mihomo/component/iface" "github.com/metacubex/mihomo/component/profile" "github.com/metacubex/mihomo/component/profile/cachefile" @@ -81,6 +82,7 @@ func ParseWithBytes(buf []byte) (*config.Config, error) { func ApplyConfig(cfg *config.Config, force bool) { mux.Lock() defer mux.Unlock() + log.SetLevel(cfg.General.LogLevel) tunnel.OnSuspend() @@ -115,8 +117,6 @@ func ApplyConfig(cfg *config.Config, force bool) { tunnel.OnRunning() hcCompatibleProvider(cfg.Providers) initExternalUI() - - log.SetLevel(cfg.General.LogLevel) } func initInnerTcp() { @@ -157,13 +157,13 @@ func GetGeneral() *config.General { Interface: dialer.DefaultInterface.Load(), RoutingMark: int(dialer.DefaultRoutingMark.Load()), GeoXUrl: config.GeoXUrl{ - GeoIp: C.GeoIpUrl, - Mmdb: C.MmdbUrl, - ASN: C.ASNUrl, - GeoSite: C.GeoSiteUrl, + GeoIp: G.GeoIpUrl(), + Mmdb: G.MmdbUrl(), + ASN: G.ASNUrl(), + GeoSite: G.GeoSiteUrl(), }, - GeoAutoUpdate: G.GeoAutoUpdate(), - GeoUpdateInterval: G.GeoUpdateInterval(), + GeoAutoUpdate: updater.GeoAutoUpdate(), + GeoUpdateInterval: updater.GeoUpdateInterval(), GeodataMode: G.GeodataMode(), GeodataLoader: G.LoaderName(), GeositeMatcher: G.SiteMatcherName(), @@ -171,7 +171,7 @@ func GetGeneral() *config.General { FindProcessMode: tunnel.FindProcessMode(), Sniffing: tunnel.IsSniffing(), GlobalClientFingerprint: tlsC.GetGlobalFingerprint(), - GlobalUA: C.UA, + GlobalUA: mihomoHttp.UA(), } return general diff --git a/clash-meta/listener/http/server.go b/clash-meta/listener/http/server.go index 74e117f265..48f12dc5f1 100644 --- a/clash-meta/listener/http/server.go +++ b/clash-meta/listener/http/server.go @@ -37,7 +37,7 @@ func New(addr string, tunnel C.Tunnel, additions ...inbound.Addition) (*Listener } // NewWithAuthenticate -// never change type traits because it's used in CFMA +// never change type traits because it's used in CMFA func NewWithAuthenticate(addr string, tunnel C.Tunnel, authenticate bool, additions ...inbound.Addition) (*Listener, error) { getAuth := authStore.Authenticator if !authenticate { diff --git a/clash-meta/main.go b/clash-meta/main.go index 26f1d2c0c2..8910a00653 100644 --- a/clash-meta/main.go +++ b/clash-meta/main.go @@ -11,6 +11,7 @@ import ( "strings" "syscall" + "github.com/metacubex/mihomo/component/geodata" "github.com/metacubex/mihomo/component/updater" "github.com/metacubex/mihomo/config" C "github.com/metacubex/mihomo/constant" @@ -78,7 +79,7 @@ func main() { } if geodataMode { - C.GeodataMode = true + geodata.SetGeodataMode(true) } if configString != "" { @@ -140,7 +141,7 @@ func main() { log.Fatalln("Parse config error: %s", err.Error()) } - if C.GeoAutoUpdate { + if updater.GeoAutoUpdate() { updater.RegisterGeoUpdater() } diff --git a/clash-meta/rules/common/geoip.go b/clash-meta/rules/common/geoip.go index 7d6871c7eb..61fae50443 100644 --- a/clash-meta/rules/common/geoip.go +++ b/clash-meta/rules/common/geoip.go @@ -46,7 +46,7 @@ func (g *GEOIP) Match(metadata *C.Metadata) (bool, string) { return g.isLan(ip), g.adapter } - if C.GeodataMode { + if geodata.GeodataMode() { if g.isSourceIP { if slices.Contains(metadata.SrcGeoIP, g.country) { return true, g.adapter @@ -102,7 +102,7 @@ func (g *GEOIP) MatchIp(ip netip.Addr) bool { return g.isLan(ip) } - if C.GeodataMode { + if geodata.GeodataMode() { matcher, err := g.getIPMatcher() if err != nil { return false @@ -124,7 +124,7 @@ func (g dnsFallbackFilter) MatchIp(ip netip.Addr) bool { return false } - if C.GeodataMode { + if geodata.GeodataMode() { matcher, err := g.getIPMatcher() if err != nil { return false @@ -170,7 +170,7 @@ func (g *GEOIP) GetCountry() string { } func (g *GEOIP) GetIPMatcher() (router.IPMatcher, error) { - if C.GeodataMode { + if geodata.GeodataMode() { return g.getIPMatcher() } return nil, errors.New("not geodata mode") @@ -193,10 +193,6 @@ func (g *GEOIP) GetRecodeSize() int { } func NewGEOIP(country string, adapter string, isSrc, noResolveIP bool) (*GEOIP, error) { - if err := geodata.InitGeoIP(); err != nil { - log.Errorln("can't initial GeoIP: %s", err) - return nil, err - } country = strings.ToLower(country) geoip := &GEOIP{ @@ -206,11 +202,17 @@ func NewGEOIP(country string, adapter string, isSrc, noResolveIP bool) (*GEOIP, noResolveIP: noResolveIP, isSourceIP: isSrc, } - if !C.GeodataMode || country == "lan" { + + if country == "lan" { return geoip, nil } - if C.GeodataMode { + if err := geodata.InitGeoIP(); err != nil { + log.Errorln("can't initial GeoIP: %s", err) + return nil, err + } + + if geodata.GeodataMode() { geoIPMatcher, err := geoip.getIPMatcher() // test load if err != nil { return nil, err diff --git a/clash-meta/rules/common/ipasn.go b/clash-meta/rules/common/ipasn.go index bcff4e7251..813923ac1f 100644 --- a/clash-meta/rules/common/ipasn.go +++ b/clash-meta/rules/common/ipasn.go @@ -63,7 +63,6 @@ func (a *ASN) GetASN() string { } func NewIPASN(asn string, adapter string, isSrc, noResolveIP bool) (*ASN, error) { - C.ASNEnable = true if err := geodata.InitASN(); err != nil { log.Errorln("can't initial ASN: %s", err) return nil, err diff --git a/clash-nyanpasu/.github/workflows/ci.yml b/clash-nyanpasu/.github/workflows/ci.yml index 21aec4463d..b9a72f9cef 100644 --- a/clash-nyanpasu/.github/workflows/ci.yml +++ b/clash-nyanpasu/.github/workflows/ci.yml @@ -35,7 +35,9 @@ jobs: sudo apt-get install -y libgtk-3-dev libayatana-appindicator3-dev - libwebkit2gtk-4.0-dev + libwebkit2gtk-4.1-dev + librsvg2-dev + libxdo-dev webkit2gtk-driver xvfb - uses: Swatinem/rust-cache@v2 diff --git a/clash-nyanpasu/.github/workflows/deps-build-linux.yaml b/clash-nyanpasu/.github/workflows/deps-build-linux.yaml index 0a6ffab4f2..f39adcb350 100644 --- a/clash-nyanpasu/.github/workflows/deps-build-linux.yaml +++ b/clash-nyanpasu/.github/workflows/deps-build-linux.yaml @@ -62,7 +62,7 @@ jobs: - name: Setup Toolchain run: | sudo apt-get update - sudo apt-get install -y libgtk-3-dev webkit2gtk-4.0 libappindicator3-dev librsvg2-dev patchelf openssl + sudo apt-get install -y libwebkit2gtk-4.1-dev libxdo-dev libappindicator3-dev librsvg2-dev patchelf openssl - uses: Swatinem/rust-cache@v2 with: workspaces: "./backend/" @@ -97,8 +97,8 @@ jobs: if: ${{ inputs.aarch64 == false }} env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - TAURI_PRIVATE_KEY: ${{ secrets.TAURI_PRIVATE_KEY }} - TAURI_KEY_PASSWORD: ${{ secrets.TAURI_KEY_PASSWORD }} + TAURI_SIGNING_PRIVATE_KEY: ${{ secrets.TAURI_PRIVATE_KEY }} + TAURI_SIGNING_PRIVATE_KEY_PASSWORD: ${{ secrets.TAURI_KEY_PASSWORD }} NIGHTLY: ${{ inputs.nightly == true && 'true' || 'false' }} with: tagName: ${{ inputs.tag }} @@ -113,8 +113,8 @@ jobs: shell: bash env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - TAURI_PRIVATE_KEY: ${{ secrets.TAURI_PRIVATE_KEY }} - TAURI_KEY_PASSWORD: ${{ secrets.TAURI_KEY_PASSWORD }} + TAURI_SIGNING_PRIVATE_KEY: ${{ secrets.TAURI_PRIVATE_KEY }} + TAURI_SIGNING_PRIVATE_KEY_PASSWORD: ${{ secrets.TAURI_KEY_PASSWORD }} NIGHTLY: ${{ inputs.nightly == true && 'true' || 'false' }} CARGO_TARGET_AARCH64_UNKNOWN_LINUX_GNU_LINKER: aarch64-linux-gnu-gcc CC_aarch64_unknown_linux_gnu: aarch64-linux-gnu-gcc diff --git a/clash-nyanpasu/.github/workflows/deps-build-macos.yaml b/clash-nyanpasu/.github/workflows/deps-build-macos.yaml index 9ef753b504..15bb0b0232 100644 --- a/clash-nyanpasu/.github/workflows/deps-build-macos.yaml +++ b/clash-nyanpasu/.github/workflows/deps-build-macos.yaml @@ -107,8 +107,8 @@ jobs: uses: tauri-apps/tauri-action@v0 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - TAURI_PRIVATE_KEY: ${{ secrets.TAURI_PRIVATE_KEY }} - TAURI_KEY_PASSWORD: ${{ secrets.TAURI_KEY_PASSWORD }} + TAURI_SIGNING_PRIVATE_KEY: ${{ secrets.TAURI_PRIVATE_KEY }} + TAURI_SIGNING_PRIVATE_KEY_PASSWORD: ${{ secrets.TAURI_KEY_PASSWORD }} NIGHTLY: ${{ inputs.nightly == true && 'true' || 'false' }} NODE_OPTIONS: "--max_old_space_size=4096" with: @@ -125,8 +125,8 @@ jobs: env: TAG_NAME: ${{ inputs.tag }} GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - TAURI_PRIVATE_KEY: ${{ secrets.TAURI_PRIVATE_KEY }} - TAURI_KEY_PASSWORD: ${{ secrets.TAURI_KEY_PASSWORD }} + TAURI_SIGNING_PRIVATE_KEY: ${{ secrets.TAURI_PRIVATE_KEY }} + TAURI_SIGNING_PRIVATE_KEY_PASSWORD: ${{ secrets.TAURI_KEY_PASSWORD }} NIGHTLY: ${{ inputs.nightly == true && 'true' || 'false' }} NODE_OPTIONS: "--max_old_space_size=4096" run: | diff --git a/clash-nyanpasu/.github/workflows/deps-build-windows-nsis.yaml b/clash-nyanpasu/.github/workflows/deps-build-windows-nsis.yaml index 6c14f99b29..315cbe67d0 100644 --- a/clash-nyanpasu/.github/workflows/deps-build-windows-nsis.yaml +++ b/clash-nyanpasu/.github/workflows/deps-build-windows-nsis.yaml @@ -85,8 +85,8 @@ jobs: uses: tauri-apps/tauri-action@v0 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - TAURI_PRIVATE_KEY: ${{ secrets.TAURI_PRIVATE_KEY }} - TAURI_KEY_PASSWORD: ${{ secrets.TAURI_KEY_PASSWORD }} + TAURI_SIGNING_PRIVATE_KEY: ${{ secrets.TAURI_PRIVATE_KEY }} + TAURI_SIGNING_PRIVATE_KEY_PASSWORD: ${{ secrets.TAURI_KEY_PASSWORD }} NIGHTLY: ${{ inputs.nightly == true && 'true' || 'false' }} with: tagName: ${{ inputs.tag }} @@ -104,7 +104,7 @@ jobs: env: TAG_NAME: ${{ inputs.tag }} GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - TAURI_PRIVATE_KEY: ${{ secrets.TAURI_PRIVATE_KEY }} - TAURI_KEY_PASSWORD: ${{ secrets.TAURI_KEY_PASSWORD }} + TAURI_SIGNING_PRIVATE_KEY: ${{ secrets.TAURI_PRIVATE_KEY }} + TAURI_SIGNING_PRIVATE_KEY_PASSWORD: ${{ secrets.TAURI_KEY_PASSWORD }} NIGHTLY: ${{ inputs.nightly == true && 'true' || 'false' }} VITE_WIN_PORTABLE: 1 diff --git a/clash-nyanpasu/.github/workflows/macos-aarch64.yaml b/clash-nyanpasu/.github/workflows/macos-aarch64.yaml index b29ce6ff54..66fdca6940 100644 --- a/clash-nyanpasu/.github/workflows/macos-aarch64.yaml +++ b/clash-nyanpasu/.github/workflows/macos-aarch64.yaml @@ -50,8 +50,8 @@ jobs: env: TAG_NAME: dev GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - TAURI_PRIVATE_KEY: ${{ secrets.TAURI_PRIVATE_KEY }} - TAURI_KEY_PASSWORD: ${{ secrets.TAURI_KEY_PASSWORD }} + TAURI_SIGNING_PRIVATE_KEY: ${{ secrets.TAURI_PRIVATE_KEY }} + TAURI_SIGNING_PRIVATE_KEY_PASSWORD: ${{ secrets.TAURI_KEY_PASSWORD }} run: | pnpm build --target aarch64-apple-darwin pnpm upload:osx-aarch64 diff --git a/clash-nyanpasu/.github/workflows/target-dev-build.yaml b/clash-nyanpasu/.github/workflows/target-dev-build.yaml index 06e50af3e4..f9b45f1fa8 100644 --- a/clash-nyanpasu/.github/workflows/target-dev-build.yaml +++ b/clash-nyanpasu/.github/workflows/target-dev-build.yaml @@ -36,15 +36,15 @@ jobs: tag: "pre-release" secrets: inherit - linux_aarch64_build: - name: Linux aarch64 Build - uses: ./.github/workflows/deps-build-linux.yaml - needs: [delete_current_releases] - with: - nightly: true - tag: "pre-release" - aarch64: true - secrets: inherit + # linux_aarch64_build: + # name: Linux aarch64 Build + # uses: ./.github/workflows/deps-build-linux.yaml + # needs: [delete_current_releases] + # with: + # nightly: true + # tag: "pre-release" + # aarch64: true + # secrets: inherit macos_amd64_build: name: macOS amd64 Build @@ -68,11 +68,10 @@ jobs: update_tag: name: Update tag - needs: - [ + needs: [ windows_build, linux_amd64_build, - linux_aarch64_build, + # linux_aarch64_build, macos_amd64_build, macos_aarch64_build, ] diff --git a/clash-nyanpasu/.prettierignore b/clash-nyanpasu/.prettierignore index 8d07b831e1..5c56bd2e08 100644 --- a/clash-nyanpasu/.prettierignore +++ b/clash-nyanpasu/.prettierignore @@ -8,3 +8,4 @@ pnpm-lock.yaml *.wxs frontend/nyanpasu/src/router.ts frontend/nyanpasu/auto-imports.d.ts +backend/tauri/gen/schemas/ diff --git a/clash-nyanpasu/backend/Cargo.lock b/clash-nyanpasu/backend/Cargo.lock index d190c51f2f..40b8323f23 100644 --- a/clash-nyanpasu/backend/Cargo.lock +++ b/clash-nyanpasu/backend/Cargo.lock @@ -4,9 +4,9 @@ version = 3 [[package]] name = "addr2line" -version = "0.22.0" +version = "0.24.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e4503c46a5c0c7844e948c9a4d6acd9f50cccb4de1c48eb9e291ea17470c678" +checksum = "f5fb1d8e4442bd405fdfd1dacb42792696b0cf9cb15882e5d097b742a676d375" dependencies = [ "gimli", ] @@ -168,9 +168,9 @@ dependencies = [ [[package]] name = "anyhow" -version = "1.0.86" +version = "1.0.87" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b3d1d046238990b9cf5bcde22a3fb3584ee5cf65fb2765f454ed428c7a0063da" +checksum = "10f00e1f6e58a40e807377c75c6a7f97bf9044fab57816f2414e6f5f4499d7b8" [[package]] name = "arbitrary" @@ -196,7 +196,6 @@ dependencies = [ "objc2-foundation", "parking_lot", "windows-sys 0.48.0", - "wl-clipboard-rs", "x11rb", ] @@ -229,6 +228,23 @@ version = "0.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7c02d123df017efcdfbd739ef81735b36c5ba83ec3c59c80a9d7ecc718f92e50" +[[package]] +name = "ashpd" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd884d7c72877a94102c3715f3b1cd09ff4fac28221add3e57cfbe25c236d093" +dependencies = [ + "enumflags2", + "futures-channel", + "futures-util", + "rand 0.8.5", + "serde", + "serde_repr", + "tokio", + "url", + "zbus", +] + [[package]] name = "assert-unchecked" version = "0.1.2" @@ -272,9 +288,9 @@ dependencies = [ [[package]] name = "async-executor" -version = "1.13.0" +version = "1.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d7ebdfa2ebdab6b1760375fa7d6f382b9f486eac35fc994625a00e89280bdbb7" +checksum = "30ca9a001c1e8ba5149f91a74362376cc6bc5b919d92d988668657bd570bdcec" dependencies = [ "async-task", "concurrent-queue", @@ -339,7 +355,7 @@ dependencies = [ "futures-lite 2.3.0", "parking", "polling 3.7.3", - "rustix 0.38.35", + "rustix 0.38.36", "slab", "tracing", "windows-sys 0.59.0", @@ -400,7 +416,7 @@ dependencies = [ "cfg-if", "event-listener 3.1.0", "futures-lite 1.13.0", - "rustix 0.38.35", + "rustix 0.38.36", "windows-sys 0.48.0", ] @@ -419,7 +435,7 @@ dependencies = [ "cfg-if", "event-listener 5.3.0", "futures-lite 2.3.0", - "rustix 0.38.35", + "rustix 0.38.36", "tracing", "windows-sys 0.59.0", ] @@ -447,7 +463,7 @@ dependencies = [ "cfg-if", "futures-core", "futures-io", - "rustix 0.38.35", + "rustix 0.38.36", "signal-hook-registry", "slab", "windows-sys 0.59.0", @@ -472,26 +488,25 @@ dependencies = [ [[package]] name = "atk" -version = "0.15.1" +version = "0.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2c3d816ce6f0e2909a96830d6911c2aff044370b1ef92d7f267b43bae5addedd" +checksum = "b4af014b17dd80e8af9fa689b2d4a211ddba6eb583c1622f35d0cb543f6b17e4" dependencies = [ "atk-sys", - "bitflags 1.3.2", "glib", "libc", ] [[package]] name = "atk-sys" -version = "0.15.1" +version = "0.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "58aeb089fb698e06db8089971c7ee317ab9644bade33383f63631437b03aafb6" +checksum = "251e0b7d90e33e0ba930891a505a9a35ece37b2dd37a14f3ffc306c13b980009" dependencies = [ "glib-sys", "gobject-sys", "libc", - "system-deps 6.2.2", + "system-deps", ] [[package]] @@ -562,9 +577,9 @@ dependencies = [ "bytes", "futures-util", "http 1.1.0", - "http-body 1.0.1", + "http-body", "http-body-util", - "hyper 1.4.1", + "hyper", "hyper-util", "itoa 1.0.11", "matchit", @@ -597,7 +612,7 @@ dependencies = [ "bytes", "futures-util", "http 1.1.0", - "http-body 1.0.1", + "http-body", "http-body-util", "mime", "pin-project-lite", @@ -621,17 +636,17 @@ dependencies = [ [[package]] name = "backtrace" -version = "0.3.73" +version = "0.3.74" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5cc23269a4f8976d0a4d2e7109211a419fe30e8d88d677cd60b6bc79c5732e0a" +checksum = "8d82cb332cdfaed17ae235a638438ac4d4839913cc2af585c3c6746e8f8bee1a" dependencies = [ "addr2line", - "cc", "cfg-if", "libc", - "miniz_oxide 0.7.4", + "miniz_oxide 0.8.0", "object", "rustc-demangle", + "windows-targets 0.52.6", ] [[package]] @@ -658,6 +673,12 @@ version = "0.22.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" +[[package]] +name = "bimap" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "230c5f1ca6a325a32553f8640d31ac9b49f2411e901e427570154868b46da4f7" + [[package]] name = "bincode" version = "1.3.3" @@ -707,6 +728,9 @@ name = "bitflags" version = "2.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b048fb63fd8b5923fc5aa7b340d8e156aec7ec02f0c78fa8a6ddc2613f6f71de" +dependencies = [ + "serde", +] [[package]] name = "bitstream-io" @@ -763,8 +787,7 @@ dependencies = [ [[package]] name = "boa_ast" version = "0.19.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b49637e7ecb7c541c46c3e885d4c49326ad8076dbfb88bef2cf3165d8ea7df2b" +source = "git+https://github.com/boa-dev/boa.git?branch=backport-0.19-fixes#b7696fc2a475817b06d05370f037d60843632a0e" dependencies = [ "bitflags 2.6.0", "boa_interner", @@ -777,8 +800,7 @@ dependencies = [ [[package]] name = "boa_engine" version = "0.19.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "411558b4cbc7d0303012e26721815e612fed78179313888fd5dd8d6c50d70099" +source = "git+https://github.com/boa-dev/boa.git?branch=backport-0.19-fixes#b7696fc2a475817b06d05370f037d60843632a0e" dependencies = [ "arrayvec 0.7.6", "bitflags 2.6.0", @@ -801,7 +823,7 @@ dependencies = [ "num-bigint", "num-integer", "num-traits", - "num_enum 0.7.3", + "num_enum", "once_cell", "pollster", "portable-atomic", @@ -822,8 +844,7 @@ dependencies = [ [[package]] name = "boa_gc" version = "0.19.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8eff345a85a39cf9b8ed863198947d61e6df2b1d774002b57341158b0ce2c525" +source = "git+https://github.com/boa-dev/boa.git?branch=backport-0.19-fixes#b7696fc2a475817b06d05370f037d60843632a0e" dependencies = [ "boa_macros", "boa_profiler", @@ -835,8 +856,7 @@ dependencies = [ [[package]] name = "boa_interner" version = "0.19.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72b779280420804c70da9043d152c84eb96e2f7c9e7d1ec3262decf59f9349df" +source = "git+https://github.com/boa-dev/boa.git?branch=backport-0.19-fixes#b7696fc2a475817b06d05370f037d60843632a0e" dependencies = [ "boa_gc", "boa_macros", @@ -851,8 +871,7 @@ dependencies = [ [[package]] name = "boa_macros" version = "0.19.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "25e0097fa69cde4c95f9869654004340fbbe2bcf3ce9189ba2a31a65ac40e0a1" +source = "git+https://github.com/boa-dev/boa.git?branch=backport-0.19-fixes#b7696fc2a475817b06d05370f037d60843632a0e" dependencies = [ "proc-macro2", "quote", @@ -863,8 +882,7 @@ dependencies = [ [[package]] name = "boa_parser" version = "0.19.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd63fe8faf62561fc8c50f9402687e8cfde720b57d292fb3b4ac17c821878ac1" +source = "git+https://github.com/boa-dev/boa.git?branch=backport-0.19-fixes#b7696fc2a475817b06d05370f037d60843632a0e" dependencies = [ "bitflags 2.6.0", "boa_ast", @@ -882,14 +900,12 @@ dependencies = [ [[package]] name = "boa_profiler" version = "0.19.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd9da895f0df9e2a97b36c1f98e0c5d2ab963abc8679d80f2a66f7bcb211ce90" +source = "git+https://github.com/boa-dev/boa.git?branch=backport-0.19-fixes#b7696fc2a475817b06d05370f037d60843632a0e" [[package]] name = "boa_string" version = "0.19.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c9ca6668df83fcd3c2903f6f296b7180421908c5b478ebe0d1c468be9fd60e1c" +source = "git+https://github.com/boa-dev/boa.git?branch=backport-0.19-fixes#b7696fc2a475817b06d05370f037d60843632a0e" dependencies = [ "fast-float", "paste", @@ -909,7 +925,7 @@ dependencies = [ "indoc", "isahc", "rustc-hash 2.0.0", - "smol 2.0.1", + "smol 2.0.2", "textwrap", "tracing", ] @@ -962,9 +978,9 @@ dependencies = [ [[package]] name = "bytemuck" -version = "1.17.1" +version = "1.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "773d90827bc3feecfb67fab12e24de0749aad83c74b9504ecde46237b5cd24e2" +checksum = "94bbb0ad554ad961ddc5da507a12a29b14e4ae5bda06b19f575a3e6079d2e2ae" dependencies = [ "bytemuck_derive", ] @@ -1024,36 +1040,69 @@ dependencies = [ [[package]] name = "cairo-rs" -version = "0.15.12" +version = "0.18.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c76ee391b03d35510d9fa917357c7f1855bd9a6659c95a1b392e33f49b3369bc" +checksum = "8ca26ef0159422fb77631dc9d17b102f253b876fe1586b03b803e63a309b4ee2" dependencies = [ - "bitflags 1.3.2", + "bitflags 2.6.0", "cairo-sys-rs", "glib", "libc", + "once_cell", "thiserror", ] [[package]] name = "cairo-sys-rs" -version = "0.15.1" +version = "0.18.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c55d429bef56ac9172d25fecb85dc8068307d17acd74b377866b7a1ef25d3c8" +checksum = "685c9fa8e590b8b3d678873528d83411db17242a73fccaed827770ea0fedda51" dependencies = [ "glib-sys", "libc", - "system-deps 6.2.2", + "system-deps", +] + +[[package]] +name = "camino" +version = "1.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b96ec4966b5813e2c0507c1f86115c8c5abaadc3980879c3424042a02fd1ad3" +dependencies = [ + "serde", +] + +[[package]] +name = "cargo-platform" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "24b1f0365a6c6bb4020cd05806fd0d33c44d38046b8bd7f0e40814b9763cabfc" +dependencies = [ + "serde", +] + +[[package]] +name = "cargo_metadata" +version = "0.18.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2d886547e41f740c616ae73108f6eb70afe6d940c7bc697cb30f13daec073037" +dependencies = [ + "camino", + "cargo-platform", + "semver 1.0.23", + "serde", + "serde_json", + "thiserror", ] [[package]] name = "cargo_toml" -version = "0.15.3" +version = "0.17.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "599aa35200ffff8f04c1925aa1acc92fa2e08874379ef42e210a80e527e60838" +checksum = "8a969e13a7589e9e3e4207e153bae624ade2b5622fb4684a4923b23ec3d57719" dependencies = [ "serde", - "toml 0.7.8", + "toml 0.8.2", ] [[package]] @@ -1073,9 +1122,9 @@ dependencies = [ [[package]] name = "cc" -version = "1.1.16" +version = "1.1.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e9d013ecb737093c0e86b151a7b837993cf9ec6c502946cfb44bedc392421e0b" +checksum = "b62ac837cdb5cb22e10a256099b4fc502b1dfe560cb282963a974d7abd80e476" dependencies = [ "jobserver", "libc", @@ -1108,15 +1157,6 @@ dependencies = [ "uuid", ] -[[package]] -name = "cfg-expr" -version = "0.9.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3431df59f28accaf4cb4eed4a9acc66bea3f3c3753aa6cdc2f024174ef232af7" -dependencies = [ - "smallvec", -] - [[package]] name = "cfg-expr" version = "0.15.8" @@ -1133,12 +1173,6 @@ version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" -[[package]] -name = "cfg_aliases" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fd16c4719339c4530435d38e511904438d07cce7950afa3718a84ac36c10e89e" - [[package]] name = "cfg_aliases" version = "0.2.1" @@ -1234,17 +1268,18 @@ dependencies = [ "axum", "backon", "base64 0.22.1", + "bimap", "bincode", "boa_engine", "boa_utils", "bytes", "chrono", "clap", - "cocoa 0.25.0", + "cocoa", "colored", "convert_case 0.6.0", "ctrlc", - "dashmap 6.0.1", + "dashmap 6.1.0", "deelevate", "delay_timer", "derive_builder", @@ -1272,7 +1307,7 @@ dependencies = [ "nyanpasu-utils", "objc", "once_cell", - "open 5.3.0", + "open", "openssl", "os_pipe", "oxc_allocator", @@ -1288,7 +1323,7 @@ dependencies = [ "redb", "regex", "relative-path", - "reqwest 0.12.7", + "reqwest", "rfd", "rs-snowflake", "runas", @@ -1305,7 +1340,16 @@ dependencies = [ "sysproxy", "tauri", "tauri-build", + "tauri-plugin-clipboard-manager", "tauri-plugin-deep-link", + "tauri-plugin-dialog", + "tauri-plugin-fs", + "tauri-plugin-global-shortcut", + "tauri-plugin-notification", + "tauri-plugin-os", + "tauri-plugin-process", + "tauri-plugin-shell", + "tauri-plugin-updater", "tempfile", "test-log", "thiserror", @@ -1320,15 +1364,14 @@ dependencies = [ "tracing-subscriber", "url", "uuid", - "webview2-com-bridge", + "webview2-com", "which 6.0.3", "whoami", - "window-shadows", "window-vibrancy", + "windows-core 0.58.0", "windows-sys 0.59.0", "winreg 0.52.0", - "wry", - "zip 2.2.0", + "zip", "zip-extensions", ] @@ -1341,38 +1384,6 @@ dependencies = [ "error-code", ] -[[package]] -name = "cocoa" -version = "0.24.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f425db7937052c684daec3bd6375c8abe2d146dca4b8b143d6db777c39138f3a" -dependencies = [ - "bitflags 1.3.2", - "block", - "cocoa-foundation 0.1.2", - "core-foundation 0.9.4", - "core-graphics 0.22.3", - "foreign-types 0.3.2", - "libc", - "objc", -] - -[[package]] -name = "cocoa" -version = "0.25.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f6140449f97a6e97f9511815c5632d84c8aacf8ac271ad77c559218161a1373c" -dependencies = [ - "bitflags 1.3.2", - "block", - "cocoa-foundation 0.1.2", - "core-foundation 0.9.4", - "core-graphics 0.23.2", - "foreign-types 0.5.0", - "libc", - "objc", -] - [[package]] name = "cocoa" version = "0.26.0" @@ -1381,7 +1392,7 @@ checksum = "f79398230a6e2c08f5c9760610eb6924b52aa9e7950a619602baba59dcbbdbb2" dependencies = [ "bitflags 2.6.0", "block", - "cocoa-foundation 0.2.0", + "cocoa-foundation", "core-foundation 0.10.0", "core-graphics 0.24.0", "foreign-types 0.5.0", @@ -1389,20 +1400,6 @@ dependencies = [ "objc", ] -[[package]] -name = "cocoa-foundation" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c6234cbb2e4c785b456c0644748b1ac416dd045799740356f8363dfe00c93f7" -dependencies = [ - "bitflags 1.3.2", - "block", - "core-foundation 0.9.4", - "core-graphics-types 0.1.3", - "libc", - "objc", -] - [[package]] name = "cocoa-foundation" version = "0.2.0" @@ -1535,19 +1532,6 @@ version = "0.8.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" -[[package]] -name = "core-graphics" -version = "0.22.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2581bbab3b8ffc6fcbd550bf46c355135d16e9ff2a6ea032ad6b9bf1d7efe4fb" -dependencies = [ - "bitflags 1.3.2", - "core-foundation 0.9.4", - "core-graphics-types 0.1.3", - "foreign-types 0.3.2", - "libc", -] - [[package]] name = "core-graphics" version = "0.23.2" @@ -1598,9 +1582,9 @@ dependencies = [ [[package]] name = "cpufeatures" -version = "0.2.13" +version = "0.2.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "51e852e6dc9a5bed1fae92dd2375037bf2b768725bf3be87811edee3249d09ad" +checksum = "608697df725056feaccfa42cffdaeeec3fccc4ffc38358ecd19b243e716a78e0" dependencies = [ "libc", ] @@ -1824,9 +1808,9 @@ dependencies = [ [[package]] name = "dashmap" -version = "6.0.1" +version = "6.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "804c8821570c3f8b70230c2ba75ffa5c0f9a4189b9a432b6656c536712acae28" +checksum = "5041cc499144891f3790297212f32a74fb938e5136a14943f338ef9e0ae276cf" dependencies = [ "cfg-if", "crossbeam-utils", @@ -1898,14 +1882,14 @@ dependencies = [ ] [[package]] -name = "derive-new" -version = "0.6.0" +name = "derivative" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d150dea618e920167e5973d70ae6ece4385b7164e0d799fe7c122dd0a5d912ad" +checksum = "fcc3dd5e9e9c0b295d6e1e4d811fb6f157d5ffd784b8d202fc62eac8035a770b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 1.0.109", ] [[package]] @@ -2104,6 +2088,29 @@ dependencies = [ "libloading 0.8.5", ] +[[package]] +name = "dlopen2" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e1297103d2bbaea85724fcee6294c2d50b1081f9ad47d0f6f6f61eda65315a6" +dependencies = [ + "dlopen2_derive", + "libc", + "once_cell", + "winapi", +] + +[[package]] +name = "dlopen2_derive" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2b99bf03862d7f545ebc28ddd33a665b50865f4dfd84031a393823879bd4c54" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.77", +] + [[package]] name = "doctest-file" version = "1.0.0" @@ -2125,6 +2132,15 @@ version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "75b325c5dbd37f80359721ad39aca5a29fb04c89279657cffdda8736d0c0b9d2" +[[package]] +name = "dpi" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f25c0e292a7ca6d6498557ff1df68f32c99850012b6ea401cf8daf771f22ff53" +dependencies = [ + "serde", +] + [[package]] name = "dtoa" version = "1.0.9" @@ -2167,7 +2183,7 @@ dependencies = [ "cc", "memchr", "rustc_version 0.4.1", - "toml 0.8.19", + "toml 0.8.2", "vswhom", "winreg 0.52.0", ] @@ -2640,11 +2656,10 @@ dependencies = [ [[package]] name = "gdk" -version = "0.15.4" +version = "0.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a6e05c1f572ab0e1f15be94217f0dc29088c248b14f792a5ff0af0d84bcda9e8" +checksum = "f5ba081bdef3b75ebcdbfc953699ed2d7417d6bd853347a42a37d76406a33646" dependencies = [ - "bitflags 1.3.2", "cairo-rs", "gdk-pixbuf", "gdk-sys", @@ -2656,35 +2671,35 @@ dependencies = [ [[package]] name = "gdk-pixbuf" -version = "0.15.11" +version = "0.18.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ad38dd9cc8b099cceecdf41375bb6d481b1b5a7cd5cd603e10a69a9383f8619a" +checksum = "50e1f5f1b0bfb830d6ccc8066d18db35c487b1b2b1e8589b5dfe9f07e8defaec" dependencies = [ - "bitflags 1.3.2", "gdk-pixbuf-sys", "gio", "glib", "libc", + "once_cell", ] [[package]] name = "gdk-pixbuf-sys" -version = "0.15.10" +version = "0.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "140b2f5378256527150350a8346dbdb08fadc13453a7a2d73aecd5fab3c402a7" +checksum = "3f9839ea644ed9c97a34d129ad56d38a25e6756f99f3a88e15cd39c20629caf7" dependencies = [ "gio-sys", "glib-sys", "gobject-sys", "libc", - "system-deps 6.2.2", + "system-deps", ] [[package]] name = "gdk-sys" -version = "0.15.1" +version = "0.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32e7a08c1e8f06f4177fb7e51a777b8c1689f743a7bc11ea91d44d2226073a88" +checksum = "31ff856cb3386dae1703a920f803abafcc580e9b5f711ca62ed1620c25b51ff2" dependencies = [ "cairo-sys-rs", "gdk-pixbuf-sys", @@ -2694,33 +2709,47 @@ dependencies = [ "libc", "pango-sys", "pkg-config", - "system-deps 6.2.2", + "system-deps", ] [[package]] name = "gdkwayland-sys" -version = "0.15.3" +version = "0.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cca49a59ad8cfdf36ef7330fe7bdfbe1d34323220cc16a0de2679ee773aee2c2" +checksum = "a90fbf5c033c65d93792192a49a8efb5bb1e640c419682a58bb96f5ae77f3d4a" dependencies = [ "gdk-sys", "glib-sys", "gobject-sys", "libc", "pkg-config", - "system-deps 6.2.2", + "system-deps", +] + +[[package]] +name = "gdkx11" +version = "0.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db2ea8a4909d530f79921290389cbd7c34cb9d623bfe970eaae65ca5f9cd9cce" +dependencies = [ + "gdk", + "gdkx11-sys", + "gio", + "glib", + "libc", + "x11", ] [[package]] name = "gdkx11-sys" -version = "0.15.1" +version = "0.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b4b7f8c7a84b407aa9b143877e267e848ff34106578b64d1e0a24bf550716178" +checksum = "fee8f00f4ee46cad2939b8990f5c70c94ff882c3028f3cc5abf950fa4ab53043" dependencies = [ "gdk-sys", "glib-sys", "libc", - "system-deps 6.2.2", + "system-deps", "x11", ] @@ -2757,6 +2786,16 @@ dependencies = [ "windows-targets 0.48.5", ] +[[package]] +name = "gethostname" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc3655aa6818d65bc620d6911f05aa7b6aeb596291e1e9f79e52df85583d1e30" +dependencies = [ + "rustix 0.38.36", + "windows-targets 0.52.6", +] + [[package]] name = "getrandom" version = "0.1.16" @@ -2793,55 +2832,60 @@ dependencies = [ [[package]] name = "gimli" -version = "0.29.0" +version = "0.31.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "40ecd4077b5ae9fd2e9e169b102c6c330d0605168eb0e8bf79952b256dbefffd" +checksum = "32085ea23f3234fc7846555e85283ba4de91e21016dc0455a16286d87a292d64" [[package]] name = "gio" -version = "0.15.12" +version = "0.18.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68fdbc90312d462781a395f7a16d96a2b379bb6ef8cd6310a2df272771c4283b" +checksum = "d4fc8f532f87b79cbc51a79748f16a6828fb784be93145a322fa14d06d354c73" dependencies = [ - "bitflags 1.3.2", "futures-channel", "futures-core", "futures-io", + "futures-util", "gio-sys", "glib", "libc", "once_cell", + "pin-project-lite", + "smallvec", "thiserror", ] [[package]] name = "gio-sys" -version = "0.15.10" +version = "0.18.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32157a475271e2c4a023382e9cab31c4584ee30a97da41d3c4e9fdd605abcf8d" +checksum = "37566df850baf5e4cb0dfb78af2e4b9898d817ed9263d1090a2df958c64737d2" dependencies = [ "glib-sys", "gobject-sys", "libc", - "system-deps 6.2.2", + "system-deps", "winapi", ] [[package]] name = "glib" -version = "0.15.12" +version = "0.18.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "edb0306fbad0ab5428b0ca674a23893db909a98582969c9b537be4ced78c505d" +checksum = "233daaf6e83ae6a12a52055f568f9d7cf4671dabb78ff9560ab6da230ce00ee5" dependencies = [ - "bitflags 1.3.2", + "bitflags 2.6.0", "futures-channel", "futures-core", "futures-executor", "futures-task", + "futures-util", + "gio-sys", "glib-macros", "glib-sys", "gobject-sys", "libc", + "memchr", "once_cell", "smallvec", "thiserror", @@ -2849,27 +2893,26 @@ dependencies = [ [[package]] name = "glib-macros" -version = "0.15.13" +version = "0.18.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "10c6ae9f6fa26f4fb2ac16b528d138d971ead56141de489f8111e259b9df3c4a" +checksum = "0bb0228f477c0900c880fd78c8759b95c7636dbd7842707f49e132378aa2acdc" dependencies = [ - "anyhow", "heck 0.4.1", - "proc-macro-crate 1.3.1", + "proc-macro-crate 2.0.2", "proc-macro-error", "proc-macro2", "quote", - "syn 1.0.109", + "syn 2.0.77", ] [[package]] name = "glib-sys" -version = "0.15.10" +version = "0.18.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef4b192f8e65e9cf76cbf4ea71fa8e3be4a0e18ffe3d68b8da6836974cc5bad4" +checksum = "063ce2eb6a8d0ea93d2bf8ba1957e78dbab6be1c2220dd3daca57d5a9d869898" dependencies = [ "libc", - "system-deps 6.2.2", + "system-deps", ] [[package]] @@ -2878,6 +2921,23 @@ version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d2fabcfbdc87f4758337ca535fb41a6d701b65693ce38287d856d1674551ec9b" +[[package]] +name = "global-hotkey" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4b86f7342b0e2abcf5e50ed8afd8bb9ffb6e30619d90f1e1a774b934a61f3e9" +dependencies = [ + "crossbeam-channel", + "keyboard-types", + "objc2", + "objc2-app-kit", + "once_cell", + "serde", + "thiserror", + "windows-sys 0.59.0", + "x11-dl", +] + [[package]] name = "globset" version = "0.4.14" @@ -2916,23 +2976,22 @@ dependencies = [ [[package]] name = "gobject-sys" -version = "0.15.10" +version = "0.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d57ce44246becd17153bd035ab4d32cfee096a657fc01f2231c9278378d1e0a" +checksum = "0850127b514d1c4a4654ead6dedadb18198999985908e6ffe4436f53c785ce44" dependencies = [ "glib-sys", "libc", - "system-deps 6.2.2", + "system-deps", ] [[package]] name = "gtk" -version = "0.15.5" +version = "0.18.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "92e3004a2d5d6d8b5057d2b57b3712c9529b62e82c77f25c1fecde1fd5c23bd0" +checksum = "93c4f5e0e20b60e10631a5f06da7fe3dda744b05ad0ea71fee2f47adf865890c" dependencies = [ "atk", - "bitflags 1.3.2", "cairo-rs", "field-offset", "futures-channel", @@ -2943,16 +3002,15 @@ dependencies = [ "gtk-sys", "gtk3-macros", "libc", - "once_cell", "pango", "pkg-config", ] [[package]] name = "gtk-sys" -version = "0.15.3" +version = "0.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d5bc2f0587cba247f60246a0ca11fe25fb733eabc3de12d1965fc07efab87c84" +checksum = "771437bf1de2c1c0b496c11505bdf748e26066bbe942dfc8f614c9460f6d7722" dependencies = [ "atk-sys", "cairo-sys-rs", @@ -2963,40 +3021,20 @@ dependencies = [ "gobject-sys", "libc", "pango-sys", - "system-deps 6.2.2", + "system-deps", ] [[package]] name = "gtk3-macros" -version = "0.15.6" +version = "0.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "684c0456c086e8e7e9af73ec5b84e35938df394712054550e81558d21c44ab0d" +checksum = "c6063efb63db582968fb7df72e1ae68aa6360dcfb0a75143f34fc7d616bad75e" dependencies = [ - "anyhow", "proc-macro-crate 1.3.1", "proc-macro-error", "proc-macro2", "quote", - "syn 1.0.109", -] - -[[package]] -name = "h2" -version = "0.3.26" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81fe527a889e1532da5c525686d96d4c2e74cdd345badf8dfef9f6b39dd5f5e8" -dependencies = [ - "bytes", - "fnv", - "futures-core", - "futures-sink", - "futures-util", - "http 0.2.12", - "indexmap 2.5.0", - "slab", - "tokio", - "tokio-util", - "tracing", + "syn 2.0.77", ] [[package]] @@ -3068,15 +3106,6 @@ dependencies = [ "allocator-api2", ] -[[package]] -name = "heck" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d621efb26863f0e9924c6ac577e8275e5e6b77455db64ffa6c65c904e9e132c" -dependencies = [ - "unicode-segmentation", -] - [[package]] name = "heck" version = "0.4.1" @@ -3161,17 +3190,6 @@ dependencies = [ "itoa 1.0.11", ] -[[package]] -name = "http-body" -version = "0.4.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ceab25649e9960c0311ea418d17bee82c0dcec1bd053b5f9a66e265a693bed2" -dependencies = [ - "bytes", - "http 0.2.12", - "pin-project-lite", -] - [[package]] name = "http-body" version = "1.0.1" @@ -3191,16 +3209,10 @@ dependencies = [ "bytes", "futures-util", "http 1.1.0", - "http-body 1.0.1", + "http-body", "pin-project-lite", ] -[[package]] -name = "http-range" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "21dec9db110f5f872ed9699c3ecf50cf16f423502706ba5c72462e28d3157573" - [[package]] name = "httparse" version = "1.9.4" @@ -3222,30 +3234,6 @@ dependencies = [ "libm", ] -[[package]] -name = "hyper" -version = "0.14.30" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a152ddd61dfaec7273fe8419ab357f33aee0d914c5f4efbf0d96fa749eea5ec9" -dependencies = [ - "bytes", - "futures-channel", - "futures-core", - "futures-util", - "h2 0.3.26", - "http 0.2.12", - "http-body 0.4.6", - "httparse", - "httpdate", - "itoa 1.0.11", - "pin-project-lite", - "socket2 0.5.7", - "tokio", - "tower-service", - "tracing", - "want", -] - [[package]] name = "hyper" version = "1.4.1" @@ -3255,9 +3243,9 @@ dependencies = [ "bytes", "futures-channel", "futures-util", - "h2 0.4.6", + "h2", "http 1.1.0", - "http-body 1.0.1", + "http-body", "httparse", "httpdate", "itoa 1.0.11", @@ -3275,7 +3263,7 @@ checksum = "08afdbb5c31130e3034af566421053ab03787c640246a446327f550d11bcb333" dependencies = [ "futures-util", "http 1.1.0", - "hyper 1.4.1", + "hyper", "hyper-util", "rustls", "rustls-pki-types", @@ -3285,19 +3273,6 @@ dependencies = [ "webpki-roots", ] -[[package]] -name = "hyper-tls" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d6183ddfa99b85da61a140bea0efc93fdf56ceaa041b37d553518030827f9905" -dependencies = [ - "bytes", - "hyper 0.14.30", - "native-tls", - "tokio", - "tokio-native-tls", -] - [[package]] name = "hyper-tls" version = "0.6.0" @@ -3306,7 +3281,7 @@ checksum = "70206fc6890eaca9fde8a0bf71caa2ddfc9fe045ac9e5c70df101a7dbde866e0" dependencies = [ "bytes", "http-body-util", - "hyper 1.4.1", + "hyper", "hyper-util", "native-tls", "tokio", @@ -3324,8 +3299,8 @@ dependencies = [ "futures-channel", "futures-util", "http 1.1.0", - "http-body 1.0.1", - "hyper 1.4.1", + "http-body", + "hyper", "pin-project-lite", "socket2 0.5.7", "tokio", @@ -3526,7 +3501,13 @@ dependencies = [ "bytemuck", "byteorder", "color_quant", + "exr", + "gif", + "jpeg-decoder", "num-traits", + "png", + "qoi", + "tiff", ] [[package]] @@ -3605,6 +3586,15 @@ dependencies = [ "cfb", ] +[[package]] +name = "infer" +version = "0.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bc150e5ce2330295b8616ce0e3f53250e53af31759a9dbedad1621ba29151847" +dependencies = [ + "cfb", +] + [[package]] name = "inout" version = "0.1.3" @@ -3667,9 +3657,9 @@ dependencies = [ [[package]] name = "intrusive-collections" -version = "0.9.6" +version = "0.9.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b694dc9f70c3bda874626d2aed13b780f137aab435f4e9814121955cf706122e" +checksum = "189d0897e4cbe8c75efedf3502c18c887b05046e59d28404d4d8e46cbc4d1e86" dependencies = [ "memoffset 0.9.1", ] @@ -3687,9 +3677,9 @@ dependencies = [ [[package]] name = "ipnet" -version = "2.9.0" +version = "2.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f518f335dce6725a761382244631d86cf0ccb2863413590b31338feb467f9c3" +checksum = "187674a687eed5fe42285b40c6291f9a01517d415fad1c3cbc6a9f778af7fcd4" [[package]] name = "iptools" @@ -3804,9 +3794,9 @@ checksum = "49f1f14873335454500d59611f1cf4a4b0f786f9ac11f4312a78e4cf2566695b" [[package]] name = "javascriptcore-rs" -version = "0.16.0" +version = "1.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bf053e7843f2812ff03ef5afe34bb9c06ffee120385caad4f6b9967fcd37d41c" +checksum = "ca5671e9ffce8ffba57afc24070e906da7fc4b1ba66f2cabebf61bf2ea257fcc" dependencies = [ "bitflags 1.3.2", "glib", @@ -3815,28 +3805,30 @@ dependencies = [ [[package]] name = "javascriptcore-rs-sys" -version = "0.4.0" +version = "1.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "905fbb87419c5cde6e3269537e4ea7d46431f3008c5d057e915ef3f115e7793c" +checksum = "af1be78d14ffa4b75b66df31840478fef72b51f8c2465d4ca7c194da9f7a5124" dependencies = [ "glib-sys", "gobject-sys", "libc", - "system-deps 5.0.0", + "system-deps", ] [[package]] name = "jni" -version = "0.20.0" +version = "0.21.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "039022cdf4d7b1cf548d31f60ae783138e5fd42013f6271049d7df7afadef96c" +checksum = "1a87aa2bb7d2af34197c04845522473242e1aa17c12f4935d5856491a7fb8c97" dependencies = [ "cesu8", + "cfg-if", "combine", "jni-sys", "log", "thiserror", "walkdir", + "windows-sys 0.45.0", ] [[package]] @@ -3859,6 +3851,9 @@ name = "jpeg-decoder" version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f5d4a7da358eff58addd2877a45865158f0d78c911d43a5784ceb7bbf52833b0" +dependencies = [ + "rayon", +] [[package]] name = "js-sys" @@ -3892,6 +3887,17 @@ dependencies = [ "serde_json", ] +[[package]] +name = "keyboard-types" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b750dcadc39a09dbadd74e118f6dd6598df77fa01df0cfcdc52c28dece74528a" +dependencies = [ + "bitflags 2.6.0", + "serde", + "unicode-segmentation", +] + [[package]] name = "kill_tree" version = "0.2.4" @@ -4002,9 +4008,9 @@ dependencies = [ [[package]] name = "libappindicator" -version = "0.7.1" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "db2d3cb96d092b4824cb306c9e544c856a4cb6210c1081945187f7f1924b47e8" +checksum = "03589b9607c868cc7ae54c0b2a22c8dc03dd41692d48f2d7df73615c6a95dc0a" dependencies = [ "glib", "gtk", @@ -4015,9 +4021,9 @@ dependencies = [ [[package]] name = "libappindicator-sys" -version = "0.7.3" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1b3b6681973cea8cc3bce7391e6d7d5502720b80a581c9a95c9cbaf592826aa" +checksum = "6e9ec52138abedcc58dc17a7c6c0c00a2bdb4f3427c7f63fa97fd0d859155caf" dependencies = [ "gtk-sys", "libloading 0.7.4", @@ -4438,9 +4444,9 @@ dependencies = [ [[package]] name = "mlua-sys" -version = "0.6.2" +version = "0.6.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3ab7a5b4756b8177a2dfa8e0bbcde63bd4000afbc4ab20cbb68d114a25470f29" +checksum = "ebe026d6bd1583a9cf9080e189030ddaea7e6f5f0deb366a8e26f8a26c4135b8" dependencies = [ "cc", "cfg-if", @@ -4449,6 +4455,25 @@ dependencies = [ "pkg-config", ] +[[package]] +name = "muda" +version = "0.14.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba8ac4080fb1e097c2c22acae467e46e4da72d941f02e82b67a87a2a89fa38b1" +dependencies = [ + "cocoa", + "crossbeam-channel", + "dpi", + "gtk", + "keyboard-types", + "objc", + "once_cell", + "png", + "serde", + "thiserror", + "windows-sys 0.59.0", +] + [[package]] name = "nanoid" version = "0.4.0" @@ -4477,14 +4502,16 @@ dependencies = [ [[package]] name = "ndk" -version = "0.6.0" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2032c77e030ddee34a6787a64166008da93f6a352b629261d0fee232b8742dd4" +checksum = "c3f42e7bbe13d351b6bead8286a43aac9534b82bd3cc43e47037f012ebfd62d4" dependencies = [ - "bitflags 1.3.2", + "bitflags 2.6.0", "jni-sys", + "log", "ndk-sys", - "num_enum 0.5.11", + "num_enum", + "raw-window-handle", "thiserror", ] @@ -4496,9 +4523,9 @@ checksum = "27b02d87554356db9e9a873add8782d4ea6e3e58ea071a9adb9a2e8ddb884a8b" [[package]] name = "ndk-sys" -version = "0.3.0" +version = "0.6.0+11769913" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e5a6ae77c8ee183dcbbba6150e2e6b9f3f4196a7666c02a715a95692ec1fa97" +checksum = "ee6cda3051665f1fb8d9e08fc35c96d5a244fb1be711a03b71118828afc9a873" dependencies = [ "jni-sys", ] @@ -4544,18 +4571,7 @@ dependencies = [ "bitflags 2.6.0", "cfg-if", "libc", -] - -[[package]] -name = "nix" -version = "0.28.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ab2156c4fce2f8df6c499cc1c763e4394b7482525bf2a9701c9d79d215f519e4" -dependencies = [ - "bitflags 2.6.0", - "cfg-if", - "cfg_aliases 0.1.1", - "libc", + "memoffset 0.9.1", ] [[package]] @@ -4566,9 +4582,8 @@ checksum = "71e2746dc3a24dd78b3cfcb7be93368c6de9963d30f43a6a73998a9cf4b17b46" dependencies = [ "bitflags 2.6.0", "cfg-if", - "cfg_aliases 0.2.1", + "cfg_aliases", "libc", - "memoffset 0.9.1", ] [[package]] @@ -4728,34 +4743,13 @@ dependencies = [ "libc", ] -[[package]] -name = "num_enum" -version = "0.5.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1f646caf906c20226733ed5b1374287eb97e3c2a5c227ce668c1f2ce20ae57c9" -dependencies = [ - "num_enum_derive 0.5.11", -] - [[package]] name = "num_enum" version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4e613fc340b2220f734a8595782c551f1250e969d87d3be1ae0579e8d4065179" dependencies = [ - "num_enum_derive 0.7.3", -] - -[[package]] -name = "num_enum_derive" -version = "0.5.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dcbff9bc912032c62bf65ef1d5aea88983b420f4f839db1e9b0c281a25c9c799" -dependencies = [ - "proc-macro-crate 1.3.1", - "proc-macro2", - "quote", - "syn 1.0.109", + "num_enum_derive", ] [[package]] @@ -4764,7 +4758,7 @@ version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "af1844ef2428cc3e1cb900be36181049ef3d3193c63e43026cfe202983b27a56" dependencies = [ - "proc-macro-crate 3.2.0", + "proc-macro-crate 2.0.2", "proc-macro2", "quote", "syn 2.0.77", @@ -4790,7 +4784,7 @@ dependencies = [ "futures", "futures-util", "http-body-util", - "hyper 1.4.1", + "hyper", "hyper-util", "interprocess", "nyanpasu-utils", @@ -4986,16 +4980,6 @@ version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c08d65885ee38876c4f86fa503fb49d7b507c2b62552df7c70b2fce627e06381" -[[package]] -name = "open" -version = "3.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2078c0039e6a54a0c42c28faa984e115fb4c2d5bf2208f77d1961002df8576f8" -dependencies = [ - "pathdiff", - "windows-sys 0.42.0", -] - [[package]] name = "open" version = "5.3.0" @@ -5239,7 +5223,7 @@ checksum = "0343ef487214dbf9f296e155caeaab0d20a5da577ebd54a80f4fa4ce6a462f5a" dependencies = [ "assert-unchecked", "bitflags 2.6.0", - "dashmap 6.0.1", + "dashmap 6.1.0", "nonmax", "oxc_allocator", "oxc_ast_macros", @@ -5252,11 +5236,11 @@ dependencies = [ [[package]] name = "pango" -version = "0.15.10" +version = "0.18.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22e4045548659aee5313bde6c582b0d83a627b7904dd20dc2d9ef0895d414e4f" +checksum = "7ca27ec1eb0457ab26f3036ea52229edbdb74dee1edd29063f5b9b010e7ebee4" dependencies = [ - "bitflags 1.3.2", + "gio", "glib", "libc", "once_cell", @@ -5265,21 +5249,21 @@ dependencies = [ [[package]] name = "pango-sys" -version = "0.15.10" +version = "0.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2a00081cde4661982ed91d80ef437c20eacaf6aa1a5962c0279ae194662c3aa" +checksum = "436737e391a843e5933d6d9aa102cb126d501e815b83601365a948a518555dc5" dependencies = [ "glib-sys", "gobject-sys", "libc", - "system-deps 6.2.2", + "system-deps", ] [[package]] name = "parking" -version = "2.2.0" +version = "2.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bb813b8af86854136c6922af0598d719255ecb2179515e6e7730d468f05c9cae" +checksum = "f38d5652c16fde515bb1ecef450ab0f6a219d619a7274976324d5e377f7dceba" [[package]] name = "parking_lot" @@ -5347,9 +5331,9 @@ checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" [[package]] name = "pest" -version = "2.7.11" +version = "2.7.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd53dff83f26735fdc1ca837098ccf133605d794cdae66acfc2bfac3ec809d95" +checksum = "9c73c26c01b8c87956cea613c907c9d6ecffd8d18a2a5908e5de0adfaa185cea" dependencies = [ "memchr", "thiserror", @@ -5358,9 +5342,9 @@ dependencies = [ [[package]] name = "pest_derive" -version = "2.7.11" +version = "2.7.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a548d2beca6773b1c244554d36fcf8548a8a58e74156968211567250e48e49a" +checksum = "664d22978e2815783adbdd2c588b455b1bd625299ce36b2a99881ac9627e6d8d" dependencies = [ "pest", "pest_generator", @@ -5368,9 +5352,9 @@ dependencies = [ [[package]] name = "pest_generator" -version = "2.7.11" +version = "2.7.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c93a82e8d145725dcbaf44e5ea887c8a869efdcc28706df2d08c69e17077183" +checksum = "a2d5487022d5d33f4c30d91c22afa240ce2a644e87fe08caad974d4eab6badbe" dependencies = [ "pest", "pest_meta", @@ -5381,9 +5365,9 @@ dependencies = [ [[package]] name = "pest_meta" -version = "2.7.11" +version = "2.7.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a941429fea7e08bedec25e4f6785b6ffaacc6b755da98df5ef3e7dcf4a124c4f" +checksum = "0091754bbd0ea592c4deb3a122ce8ecbb0753b738aa82bc055fcc2eccc8d8174" dependencies = [ "once_cell", "pest", @@ -5645,7 +5629,7 @@ dependencies = [ "concurrent-queue", "hermit-abi 0.4.0", "pin-project-lite", - "rustix 0.38.35", + "rustix 0.38.36", "tracing", "windows-sys 0.59.0", ] @@ -5721,11 +5705,12 @@ dependencies = [ [[package]] name = "proc-macro-crate" -version = "3.2.0" +version = "2.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ecf48c7ca261d60b74ab1a7b20da18bede46776b2e55535cb958eb595c5fa7b" +checksum = "b00f26d3400549137f92511a46ac1cd8ce37cb5598a96d382381458b992a5d24" dependencies = [ - "toml_edit 0.22.20", + "toml_datetime", + "toml_edit 0.20.2", ] [[package]] @@ -6004,7 +5989,7 @@ dependencies = [ "rand 0.8.5", "rand_chacha 0.3.1", "simd_helpers", - "system-deps 6.2.2", + "system-deps", "thiserror", "v_frame", "wasm-bindgen", @@ -6024,12 +6009,6 @@ dependencies = [ "rgb", ] -[[package]] -name = "raw-window-handle" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2ff9a1f06a88b01621b7ae906ef0211290d1c8a168a15542486a8f61c0833b9" - [[package]] name = "raw-window-handle" version = "0.6.2" @@ -6171,48 +6150,6 @@ version = "1.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ba39f3699c378cd8970968dcbff9c43159ea4cfbd88d43c00b22f2ef10a435d2" -[[package]] -name = "reqwest" -version = "0.11.27" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd67538700a17451e7cba03ac727fb961abb7607553461627b97de0b89cf4a62" -dependencies = [ - "base64 0.21.7", - "bytes", - "encoding_rs", - "futures-core", - "futures-util", - "h2 0.3.26", - "http 0.2.12", - "http-body 0.4.6", - "hyper 0.14.30", - "hyper-tls 0.5.0", - "ipnet", - "js-sys", - "log", - "mime", - "native-tls", - "once_cell", - "percent-encoding", - "pin-project-lite", - "rustls-pemfile 1.0.4", - "serde", - "serde_json", - "serde_urlencoded", - "sync_wrapper 0.1.2", - "system-configuration 0.5.1", - "tokio", - "tokio-native-tls", - "tokio-util", - "tower-service", - "url", - "wasm-bindgen", - "wasm-bindgen-futures", - "wasm-streams", - "web-sys", - "winreg 0.50.0", -] - [[package]] name = "reqwest" version = "0.12.7" @@ -6224,13 +6161,13 @@ dependencies = [ "encoding_rs", "futures-core", "futures-util", - "h2 0.4.6", + "h2", "http 1.1.0", - "http-body 1.0.1", + "http-body", "http-body-util", - "hyper 1.4.1", + "hyper", "hyper-rustls", - "hyper-tls 0.6.0", + "hyper-tls", "hyper-util", "ipnet", "js-sys", @@ -6242,13 +6179,13 @@ dependencies = [ "pin-project-lite", "quinn", "rustls", - "rustls-pemfile 2.1.3", + "rustls-pemfile", "rustls-pki-types", "serde", "serde_json", "serde_urlencoded", "sync_wrapper 1.0.1", - "system-configuration 0.6.1", + "system-configuration", "tokio", "tokio-native-tls", "tokio-rustls", @@ -6265,26 +6202,26 @@ dependencies = [ [[package]] name = "rfd" -version = "0.10.0" +version = "0.14.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0149778bd99b6959285b0933288206090c50e2327f47a9c463bfdbf45c8823ea" +checksum = "25a73a7337fc24366edfca76ec521f51877b114e42dab584008209cca6719251" dependencies = [ + "ashpd", "block", "dispatch", "glib-sys", "gobject-sys", "gtk-sys", "js-sys", - "lazy_static", "log", "objc", "objc-foundation", "objc_id", - "raw-window-handle 0.5.2", + "raw-window-handle", "wasm-bindgen", "wasm-bindgen-futures", "web-sys", - "windows 0.37.0", + "windows-sys 0.48.0", ] [[package]] @@ -6434,9 +6371,9 @@ dependencies = [ [[package]] name = "rustix" -version = "0.38.35" +version = "0.38.36" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a85d50532239da68e9addb745ba38ff4612a242c1c7ceea689c4bc7c2f43c36f" +checksum = "3f55e80d50763938498dd5ebb18647174e0c76dc38c5505294bb224624f30f36" dependencies = [ "bitflags 2.6.0", "errno", @@ -6459,15 +6396,6 @@ dependencies = [ "zeroize", ] -[[package]] -name = "rustls-pemfile" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1c74cae0a4cf6ccbbf5f359f08efdf8ee7e1dc532573bf0db71968cb56b1448c" -dependencies = [ - "base64 0.21.7", -] - [[package]] name = "rustls-pemfile" version = "2.1.3" @@ -6524,11 +6452,37 @@ dependencies = [ [[package]] name = "schannel" -version = "0.1.23" +version = "0.1.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fbc91545643bcf3a0bbb6569265615222618bdf33ce4ffbbd13c4bbd4c093534" +checksum = "e9aaafd5a2b6e3d657ff009d82fbd630b6bd54dd4eb06f21693925cdf80f9b8b" dependencies = [ - "windows-sys 0.52.0", + "windows-sys 0.59.0", +] + +[[package]] +name = "schemars" +version = "0.8.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09c024468a378b7e36765cd36702b7a90cc3cba11654f6685c8f233408e89e92" +dependencies = [ + "dyn-clone", + "indexmap 1.9.3", + "schemars_derive", + "serde", + "serde_json", + "url", +] + +[[package]] +name = "schemars_derive" +version = "0.8.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1eee588578aff73f856ab961cd2f79e36bc45d7ded33a7562adba4667aecc0e" +dependencies = [ + "proc-macro2", + "quote", + "serde_derive_internals", + "syn 2.0.77", ] [[package]] @@ -6636,13 +6590,24 @@ checksum = "a3f0bf26fd526d2a95683cd0f87bf103b8539e2ca1ef48ce002d67aad59aa0b4" [[package]] name = "serde" -version = "1.0.209" +version = "1.0.210" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "99fce0ffe7310761ca6bf9faf5115afbc19688edd00171d81b1bb1b116c63e09" +checksum = "c8e3592472072e6e22e0a54d5904d9febf8508f65fb8552499a1abc7d1078c3a" dependencies = [ "serde_derive", ] +[[package]] +name = "serde-untagged" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2676ba99bd82f75cae5cbd2c8eda6fa0b8760f18978ea840e980dd5567b5c5b6" +dependencies = [ + "erased-serde", + "serde", + "typeid", +] + [[package]] name = "serde-value" version = "0.7.0" @@ -6655,9 +6620,20 @@ dependencies = [ [[package]] name = "serde_derive" -version = "1.0.209" +version = "1.0.210" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a5831b979fd7b5439637af1752d535ff49f4860c0f341d1baeb6faf0f4242170" +checksum = "243902eda00fad750862fc144cea25caca5e20d615af0a81bee94ca738f1df1f" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.77", +] + +[[package]] +name = "serde_derive_internals" +version = "0.29.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "18d26a20a969b9e3fdf2fc2d9f21eda6c40e2de84c9408bb5d3b05d499aae711" dependencies = [ "proc-macro2", "quote", @@ -6670,7 +6646,6 @@ version = "1.0.128" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6ff5456707a1de34e7e37f2a6fd3d3f808c318259cbd01ab6377795054b483d8" dependencies = [ - "indexmap 2.5.0", "itoa 1.0.11", "memchr", "ryu", @@ -6781,9 +6756,9 @@ dependencies = [ [[package]] name = "serialize-to-javascript" -version = "0.1.2" +version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "04f3666a07a197cdb77cdf306c32be9b7f598d7060d50cfd4d5aa04bfd92f6c5" +checksum = "c9823f2d3b6a81d98228151fdeaf848206a7855a7a042bbf9bf870449a66cafb" dependencies = [ "serde", "serde_json", @@ -6792,13 +6767,13 @@ dependencies = [ [[package]] name = "serialize-to-javascript-impl" -version = "0.1.2" +version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "772ee033c0916d670af7860b6e1ef7d658a4629a6d0b4c8c3e67f09b3765b75d" +checksum = "74064874e9f6a15f04c1f3cb627902d0e6b410abbf36668afa873c61889f1763" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 1.0.109", ] [[package]] @@ -7005,7 +6980,7 @@ dependencies = [ "libc", "log", "memmap2", - "rustix 0.38.35", + "rustix 0.38.36", "thiserror", "wayland-backend", "wayland-client", @@ -7036,9 +7011,9 @@ dependencies = [ [[package]] name = "smol" -version = "2.0.1" +version = "2.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aad24f41392790e6ac67f4f4cd871da61f7d758e07b5622431e491e897d9c8a7" +checksum = "a33bd3e260892199c3ccfc487c88b2da2265080acb316cd920da72fdfd7c599f" dependencies = [ "async-channel 2.3.1", "async-executor", @@ -7072,31 +7047,51 @@ dependencies = [ ] [[package]] -name = "soup2" -version = "0.2.1" +name = "softbuffer" +version = "0.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b2b4d76501d8ba387cf0fefbe055c3e0a59891d09f0f995ae4e4b16f6b60f3c0" +checksum = "18051cdd562e792cad055119e0cdb2cfc137e44e3987532e0f9659a77931bb08" dependencies = [ - "bitflags 1.3.2", - "gio", - "glib", - "libc", - "once_cell", - "soup2-sys", + "bytemuck", + "cfg_aliases", + "core-graphics 0.24.0", + "foreign-types 0.5.0", + "js-sys", + "log", + "objc2", + "objc2-foundation", + "objc2-quartz-core", + "raw-window-handle", + "redox_syscall", + "wasm-bindgen", + "web-sys", + "windows-sys 0.59.0", ] [[package]] -name = "soup2-sys" -version = "0.2.0" +name = "soup3" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "009ef427103fcb17f802871647a7fa6c60cbb654b4c4e4c0ac60a31c5f6dc9cf" +checksum = "471f924a40f31251afc77450e781cb26d55c0b650842efafc9c6cbd2f7cc4f9f" +dependencies = [ + "futures-channel", + "gio", + "glib", + "libc", + "soup3-sys", +] + +[[package]] +name = "soup3-sys" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ebe8950a680a12f24f15ebe1bf70db7af98ad242d9db43596ad3108aab86c27" dependencies = [ - "bitflags 1.3.2", "gio-sys", "glib-sys", "gobject-sys", "libc", - "system-deps 5.0.0", + "system-deps", ] [[package]] @@ -7122,9 +7117,9 @@ checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" [[package]] name = "state" -version = "0.5.3" +version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dbe866e1e51e8260c9eed836a042a5e7f6726bb2b411dffeaa712e19c388f23b" +checksum = "2b8c4a4445d81357df8b1a650d0d0d6fbbbfe99d064aa5e02f3e4022061476d8" dependencies = [ "loom", ] @@ -7173,6 +7168,17 @@ version = "2.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" +[[package]] +name = "swift-rs" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4057c98e2e852d51fdcfca832aac7b571f6b351ad159f9eda5db1655f8d0c4d7" +dependencies = [ + "base64 0.21.7", + "serde", + "serde_json", +] + [[package]] name = "syn" version = "1.0.109" @@ -7258,17 +7264,6 @@ dependencies = [ "xdg", ] -[[package]] -name = "system-configuration" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba3a3adc5c275d719af8cb4272ea1c4a6d668a777f37e115f6d11ddbc1c8e0e7" -dependencies = [ - "bitflags 1.3.2", - "core-foundation 0.9.4", - "system-configuration-sys 0.5.0", -] - [[package]] name = "system-configuration" version = "0.6.1" @@ -7277,17 +7272,7 @@ checksum = "3c879d448e9d986b661742763247d3693ed13609438cf3d006f51f5368a5ba6b" dependencies = [ "bitflags 2.6.0", "core-foundation 0.9.4", - "system-configuration-sys 0.6.0", -] - -[[package]] -name = "system-configuration-sys" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a75fb188eb626b924683e3b95e3a48e63551fcfb51949de2f06a9d91dbee93c9" -dependencies = [ - "core-foundation-sys", - "libc", + "system-configuration-sys", ] [[package]] @@ -7300,61 +7285,39 @@ dependencies = [ "libc", ] -[[package]] -name = "system-deps" -version = "5.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "18db855554db7bd0e73e06cf7ba3df39f97812cb11d3f75e71c39bf45171797e" -dependencies = [ - "cfg-expr 0.9.1", - "heck 0.3.3", - "pkg-config", - "toml 0.5.11", - "version-compare 0.0.11", -] - [[package]] name = "system-deps" version = "6.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a3e535eb8dded36d55ec13eddacd30dec501792ff23a0b1682c38601b8cf2349" dependencies = [ - "cfg-expr 0.15.8", + "cfg-expr", "heck 0.5.0", "pkg-config", - "toml 0.8.19", - "version-compare 0.2.0", + "toml 0.8.2", + "version-compare", ] [[package]] name = "tao" -version = "0.16.10" +version = "0.30.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "48d298c441a1da46e28e8ad8ec205aab7fd8cd71b9d10e05454224eef422e1ae" +checksum = "2a93f2c6b8fdaeb7f417bda89b5bc767999745c3052969664ae1fa65892deb7e" dependencies = [ - "bitflags 1.3.2", - "cairo-rs", - "cc", - "cocoa 0.24.1", - "core-foundation 0.9.4", - "core-graphics 0.22.3", + "bitflags 2.6.0", + "cocoa", + "core-foundation 0.10.0", + "core-graphics 0.24.0", "crossbeam-channel", - "dirs-next", "dispatch", - "gdk", - "gdk-pixbuf", - "gdk-sys", + "dlopen2", + "dpi", "gdkwayland-sys", "gdkx11-sys", - "gio", - "glib", - "glib-sys", "gtk", - "image 0.24.9", "instant", "jni", "lazy_static", - "libappindicator", "libc", "log", "ndk", @@ -7363,15 +7326,14 @@ dependencies = [ "objc", "once_cell", "parking_lot", - "png", - "raw-window-handle 0.5.2", + "raw-window-handle", "scopeguard", - "serde", "tao-macros", "unicode-segmentation", - "uuid", - "windows 0.39.0", - "windows-implement 0.39.0", + "url", + "windows 0.58.0", + "windows-core 0.58.0", + "windows-version", "x11-dl", ] @@ -7411,95 +7373,83 @@ checksum = "61c41af27dd6d1e27b1b16b489db798443478cef1f06a660c96db617ba5de3b1" [[package]] name = "tauri" -version = "1.7.2" +version = "2.0.0-rc.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0e33e3ba00a3b05eb6c57ef135781717d33728b48acf914bb05629e74d897d29" +checksum = "a6327f79726c508efbbc3826b343fd7d39ebce786bdeff5881077b35d335d9e0" dependencies = [ "anyhow", - "base64 0.22.1", "bytes", - "cocoa 0.24.1", - "dirs-next", + "cocoa", + "dirs 5.0.1", "dunce", "embed_plist", - "encoding_rs", - "flate2", "futures-util", "getrandom 0.2.15", - "glib", "glob", "gtk", "heck 0.5.0", - "http 0.2.12", - "ignore", - "indexmap 1.9.3", - "infer", - "minisign-verify", - "nix 0.26.4", - "notify-rust", + "http 1.1.0", + "image 0.25.2", + "jni", + "libc", + "log", + "mime", + "muda", "objc", - "once_cell", - "open 3.2.0", - "os_info", - "os_pipe", "percent-encoding", - "png", - "rand 0.8.5", - "raw-window-handle 0.5.2", - "regex", - "reqwest 0.11.27", - "rfd", - "semver 1.0.23", + "raw-window-handle", + "reqwest", "serde", "serde_json", "serde_repr", "serialize-to-javascript", - "shared_child", "state", - "sys-locale", - "tar", + "swift-rs", + "tauri-build", "tauri-macros", "tauri-runtime", "tauri-runtime-wry", - "tauri-utils", - "tempfile", + "tauri-utils 2.0.0-rc.9", "thiserror", - "time", "tokio", + "tray-icon", "url", - "uuid", + "urlpattern", "webkit2gtk", "webview2-com", - "windows 0.39.0", - "zip 0.6.6", + "window-vibrancy", + "windows 0.58.0", ] [[package]] name = "tauri-build" -version = "1.5.4" +version = "2.0.0-rc.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d5fb5a90a64241ddb7217d3210d844149070a911e87e8a107a707a1d4973f164" +checksum = "7938a610d1474435fa38dfba66c95ce9be7f17b500672b6e00072bca5e52fef3" dependencies = [ "anyhow", "cargo_toml", - "dirs-next", + "dirs 5.0.1", + "glob", "heck 0.5.0", "json-patch", + "schemars", "semver 1.0.23", "serde", "serde_json", - "tauri-utils", + "tauri-utils 2.0.0-rc.9", "tauri-winres", + "toml 0.8.2", "walkdir", ] [[package]] name = "tauri-codegen" -version = "1.4.5" +version = "2.0.0-rc.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "93a9e3f5cebf779a63bf24903e714ec91196c307d8249a0008b882424328bcda" +checksum = "467d3e95b57c860bea13b7c812820d9e7425e4b700e5e69b358d906f22022007" dependencies = [ - "base64 0.21.7", + "base64 0.22.1", "brotli", "ico", "json-patch", @@ -7507,30 +7457,63 @@ dependencies = [ "png", "proc-macro2", "quote", - "regex", "semver 1.0.23", "serde", "serde_json", "sha2 0.10.8", - "tauri-utils", + "syn 2.0.77", + "tauri-utils 2.0.0-rc.9", "thiserror", "time", + "url", "uuid", "walkdir", ] [[package]] name = "tauri-macros" -version = "1.4.6" +version = "2.0.0-rc.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d1d0e989f54fe06c5ef0875c5e19cf96453d099a0a774d5192ab47e80471cdab" +checksum = "c4585a906bd96bf57d063c3d60c52577ccc5de592d08f9d112e873ada79af9b9" dependencies = [ "heck 0.5.0", "proc-macro2", "quote", - "syn 1.0.109", + "syn 2.0.77", "tauri-codegen", - "tauri-utils", + "tauri-utils 2.0.0-rc.9", +] + +[[package]] +name = "tauri-plugin" +version = "2.0.0-rc.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b905ecef194245bb35baba0447703f9fe40e4c03e946c7aba54c21c23e3452c7" +dependencies = [ + "anyhow", + "glob", + "plist", + "schemars", + "serde", + "serde_json", + "tauri-utils 2.0.0-rc.9", + "toml 0.8.2", + "walkdir", +] + +[[package]] +name = "tauri-plugin-clipboard-manager" +version = "2.0.0-rc.3" +source = "git+https://github.com/tauri-apps/plugins-workspace?branch=v2#5906cf433555dc9d8358fefcd39d1aba7e64ab64" +dependencies = [ + "arboard", + "image 0.24.9", + "log", + "serde", + "serde_json", + "tauri", + "tauri-plugin", + "thiserror", ] [[package]] @@ -7542,51 +7525,194 @@ dependencies = [ "log", "objc2", "once_cell", - "tauri-utils", + "tauri-utils 1.6.1", "tokio", "windows-sys 0.59.0", "winreg 0.52.0", ] [[package]] -name = "tauri-runtime" -version = "0.14.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f33fda7d213e239077fad52e96c6b734cecedb30c2382118b64f94cb5103ff3a" +name = "tauri-plugin-dialog" +version = "2.0.0-rc.5" +source = "git+https://github.com/tauri-apps/plugins-workspace?branch=v2#5906cf433555dc9d8358fefcd39d1aba7e64ab64" dependencies = [ - "gtk", - "http 0.2.12", - "http-range", - "rand 0.8.5", - "raw-window-handle 0.5.2", + "log", + "raw-window-handle", + "rfd", "serde", "serde_json", - "tauri-utils", + "tauri", + "tauri-plugin", + "tauri-plugin-fs", + "thiserror", + "url", +] + +[[package]] +name = "tauri-plugin-fs" +version = "2.0.0-rc.3" +source = "git+https://github.com/tauri-apps/plugins-workspace?branch=v2#5906cf433555dc9d8358fefcd39d1aba7e64ab64" +dependencies = [ + "anyhow", + "dunce", + "glob", + "schemars", + "serde", + "serde_json", + "serde_repr", + "tauri", + "tauri-plugin", "thiserror", "url", "uuid", - "webview2-com", - "windows 0.39.0", +] + +[[package]] +name = "tauri-plugin-global-shortcut" +version = "2.0.0-rc.2" +source = "git+https://github.com/tauri-apps/plugins-workspace?branch=v2#5906cf433555dc9d8358fefcd39d1aba7e64ab64" +dependencies = [ + "global-hotkey", + "log", + "serde", + "serde_json", + "tauri", + "tauri-plugin", + "thiserror", +] + +[[package]] +name = "tauri-plugin-notification" +version = "2.0.0-rc.3" +source = "git+https://github.com/tauri-apps/plugins-workspace?branch=v2#5906cf433555dc9d8358fefcd39d1aba7e64ab64" +dependencies = [ + "log", + "notify-rust", + "rand 0.8.5", + "serde", + "serde_json", + "serde_repr", + "tauri", + "tauri-plugin", + "thiserror", + "time", + "url", +] + +[[package]] +name = "tauri-plugin-os" +version = "2.0.0-rc.1" +source = "git+https://github.com/tauri-apps/plugins-workspace?branch=v2#5906cf433555dc9d8358fefcd39d1aba7e64ab64" +dependencies = [ + "gethostname 0.5.0", + "log", + "os_info", + "serde", + "serde_json", + "serialize-to-javascript", + "sys-locale", + "tauri", + "tauri-plugin", + "thiserror", +] + +[[package]] +name = "tauri-plugin-process" +version = "2.0.0-rc.1" +source = "git+https://github.com/tauri-apps/plugins-workspace?branch=v2#5906cf433555dc9d8358fefcd39d1aba7e64ab64" +dependencies = [ + "tauri", + "tauri-plugin", +] + +[[package]] +name = "tauri-plugin-shell" +version = "2.0.0-rc.3" +source = "git+https://github.com/tauri-apps/plugins-workspace?branch=v2#5906cf433555dc9d8358fefcd39d1aba7e64ab64" +dependencies = [ + "encoding_rs", + "log", + "open", + "os_pipe", + "regex", + "schemars", + "serde", + "serde_json", + "shared_child", + "tauri", + "tauri-plugin", + "thiserror", + "tokio", +] + +[[package]] +name = "tauri-plugin-updater" +version = "2.0.0-rc.3" +source = "git+https://github.com/tauri-apps/plugins-workspace?branch=v2#5906cf433555dc9d8358fefcd39d1aba7e64ab64" +dependencies = [ + "base64 0.22.1", + "dirs 5.0.1", + "flate2", + "futures-util", + "http 1.1.0", + "infer 0.16.0", + "minisign-verify", + "reqwest", + "semver 1.0.23", + "serde", + "serde_json", + "tar", + "tauri", + "tauri-plugin", + "tempfile", + "thiserror", + "time", + "tokio", + "url", + "windows-sys 0.59.0", + "zip", +] + +[[package]] +name = "tauri-runtime" +version = "2.0.0-rc.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b72cd110a6699ef44963504d4fa4f6c535677bb0177da2d178f4f822a53058ed" +dependencies = [ + "dpi", + "gtk", + "http 1.1.0", + "jni", + "raw-window-handle", + "serde", + "serde_json", + "tauri-utils 2.0.0-rc.9", + "thiserror", + "url", + "windows 0.58.0", ] [[package]] name = "tauri-runtime-wry" -version = "0.14.10" +version = "2.0.0-rc.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "18c447dcd9b0f09c7dc4b752cc33e72788805bfd761fbda5692d30c48289efec" +checksum = "1eb325cca17496ccbb469e7e2fef7f3e31a1005ab0c658dc3331c7781a573401" dependencies = [ - "arboard", - "cocoa 0.24.1", + "cocoa", "gtk", + "http 1.1.0", + "jni", + "log", "percent-encoding", - "rand 0.8.5", - "raw-window-handle 0.5.2", + "raw-window-handle", + "softbuffer", + "tao", "tauri-runtime", - "tauri-utils", - "uuid", + "tauri-utils 2.0.0-rc.9", + "url", "webkit2gtk", "webview2-com", - "windows 0.39.0", + "windows 0.58.0", "wry", ] @@ -7595,14 +7721,39 @@ name = "tauri-utils" version = "1.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "83a0c939e88d82903a0a7dfb28388b12a3c03504d6bd6086550edaa3b6d8beaa" +dependencies = [ + "ctor", + "dunce", + "heck 0.5.0", + "html5ever", + "infer 0.13.0", + "json-patch", + "kuchikiki", + "log", + "memchr", + "phf 0.11.2", + "semver 1.0.23", + "serde", + "serde_json", + "serde_with", + "thiserror", + "url", + "windows-version", +] + +[[package]] +name = "tauri-utils" +version = "2.0.0-rc.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6746b87c4755f493b94920622e245aef2d771f001ddeffc203e315872d323e1c" dependencies = [ "brotli", + "cargo_metadata", "ctor", "dunce", "glob", - "heck 0.5.0", "html5ever", - "infer", + "infer 0.16.0", "json-patch", "kuchikiki", "log", @@ -7610,14 +7761,19 @@ dependencies = [ "phf 0.11.2", "proc-macro2", "quote", + "regex", + "schemars", "semver 1.0.23", "serde", + "serde-untagged", "serde_json", "serde_with", + "swift-rs", "thiserror", + "toml 0.8.2", "url", + "urlpattern", "walkdir", - "windows-version", ] [[package]] @@ -7650,7 +7806,7 @@ dependencies = [ "cfg-if", "fastrand 2.1.1", "once_cell", - "rustix 0.38.35", + "rustix 0.38.36", "windows-sys 0.59.0", ] @@ -7899,6 +8055,7 @@ dependencies = [ "signal-hook-registry", "socket2 0.5.7", "tokio-macros", + "tracing", "windows-sys 0.52.0", ] @@ -7959,15 +8116,6 @@ dependencies = [ "tokio", ] -[[package]] -name = "toml" -version = "0.5.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f4f7f0dd8d50a853a531c426359045b1998f04219d88799810762cd4ad314234" -dependencies = [ - "serde", -] - [[package]] name = "toml" version = "0.7.8" @@ -7982,21 +8130,21 @@ dependencies = [ [[package]] name = "toml" -version = "0.8.19" +version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1ed1f98e3fdc28d6d910e6737ae6ab1a93bf1985935a1193e68f93eeb68d24e" +checksum = "185d8ab0dfbb35cf1399a6344d8484209c088f75f8f68230da55d48d95d43e3d" dependencies = [ "serde", "serde_spanned", "toml_datetime", - "toml_edit 0.22.20", + "toml_edit 0.20.2", ] [[package]] name = "toml_datetime" -version = "0.6.8" +version = "0.6.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0dd7358ecb8fc2f8d014bf86f6f638ce72ba252a2c3a2572f2a795f1d23efb41" +checksum = "7cda73e2f1397b1262d6dfdcef8aafae14d1de7748d66822d3bfeeb6d03e5e4b" dependencies = [ "serde", ] @@ -8011,20 +8159,20 @@ dependencies = [ "serde", "serde_spanned", "toml_datetime", - "winnow 0.5.40", + "winnow", ] [[package]] name = "toml_edit" -version = "0.22.20" +version = "0.20.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "583c44c02ad26b0c3f3066fe629275e50627026c51ac2e595cca4c230ce1ce1d" +checksum = "396e4d48bbb2b7554c944bde63101b5ae446cff6ec4a24227428f15eb72ef338" dependencies = [ "indexmap 2.5.0", "serde", "serde_spanned", "toml_datetime", - "winnow 0.6.18", + "winnow", ] [[package]] @@ -8165,17 +8313,24 @@ dependencies = [ ] [[package]] -name = "tree_magic_mini" -version = "3.1.5" +name = "tray-icon" +version = "0.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "469a727cac55b41448315cc10427c069c618ac59bb6a4480283fcd811749bdc2" +checksum = "044d7738b3d50f288ddef035b793228740ad4d927f5466b0af55dc15e7e03cfe" dependencies = [ - "fnv", - "home", - "memchr", - "nom 7.1.3", + "core-graphics 0.24.0", + "crossbeam-channel", + "dirs 5.0.1", + "libappindicator", + "muda", + "objc2", + "objc2-app-kit", + "objc2-foundation", "once_cell", - "petgraph", + "png", + "serde", + "thiserror", + "windows-sys 0.59.0", ] [[package]] @@ -8243,6 +8398,47 @@ dependencies = [ "winapi", ] +[[package]] +name = "unic-char-property" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8c57a407d9b6fa02b4795eb81c5b6652060a15a7903ea981f3d723e6c0be221" +dependencies = [ + "unic-char-range", +] + +[[package]] +name = "unic-char-range" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0398022d5f700414f6b899e10b8348231abf9173fa93144cbc1a43b9793c1fbc" + +[[package]] +name = "unic-common" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "80d7ff825a6a654ee85a63e80f92f054f904f21e7d12da4e22f9834a4aaa35bc" + +[[package]] +name = "unic-ucd-ident" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e230a37c0381caa9219d67cf063aa3a375ffed5bf541a452db16e744bdab6987" +dependencies = [ + "unic-char-property", + "unic-char-range", + "unic-ucd-version", +] + +[[package]] +name = "unic-ucd-version" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96bd2f2237fe450fcd0a1d2f5f4e91711124f7857ba2e964247776ebeeb7b0c4" +dependencies = [ + "unic-common", +] + [[package]] name = "unicode-bidi" version = "0.3.15" @@ -8312,6 +8508,18 @@ dependencies = [ "serde", ] +[[package]] +name = "urlpattern" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "70acd30e3aa1450bc2eece896ce2ad0d178e9c079493819301573dae3c37ba6d" +dependencies = [ + "regex", + "serde", + "unic-ucd-ident", + "url", +] + [[package]] name = "utf-8" version = "0.7.6" @@ -8380,12 +8588,6 @@ version = "0.2.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" -[[package]] -name = "version-compare" -version = "0.0.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1c18c859eead79d8b95d09e4678566e8d70105c4e7b251f707a03df32442661b" - [[package]] name = "version-compare" version = "0.2.0" @@ -8579,7 +8781,7 @@ checksum = "056535ced7a150d45159d3a8dc30f91a2e2d588ca0b23f70e56033622b8016f6" dependencies = [ "cc", "downcast-rs", - "rustix 0.38.35", + "rustix 0.38.36", "scoped-tls", "smallvec", "wayland-sys", @@ -8592,7 +8794,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e3f45d1222915ef1fd2057220c1d9d9624b7654443ea35c3877f7a52bd0a5a2d" dependencies = [ "bitflags 2.6.0", - "rustix 0.38.35", + "rustix 0.38.36", "wayland-backend", "wayland-scanner", ] @@ -8614,7 +8816,7 @@ version = "0.31.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3a94697e66e76c85923b0d28a0c251e8f0666f58fc47d316c0f4da6da75d37cb" dependencies = [ - "rustix 0.38.35", + "rustix 0.38.36", "wayland-client", "xcursor", ] @@ -8678,9 +8880,9 @@ dependencies = [ [[package]] name = "webkit2gtk" -version = "0.18.2" +version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8f859735e4a452aeb28c6c56a852967a8a76c8eb1cc32dbf931ad28a13d6370" +checksum = "76b1bc1e54c581da1e9f179d0b38512ba358fb1af2d634a1affe42e37172361a" dependencies = [ "bitflags 1.3.2", "cairo-rs", @@ -8696,20 +8898,18 @@ dependencies = [ "javascriptcore-rs", "libc", "once_cell", - "soup2", + "soup3", "webkit2gtk-sys", ] [[package]] name = "webkit2gtk-sys" -version = "0.18.0" +version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4d76ca6ecc47aeba01ec61e480139dda143796abcae6f83bcddf50d6b5b1dcf3" +checksum = "62daa38afc514d1f8f12b8693d30d5993ff77ced33ce30cd04deebc267a6d57c" dependencies = [ - "atk-sys", "bitflags 1.3.2", "cairo-sys-rs", - "gdk-pixbuf-sys", "gdk-sys", "gio-sys", "glib-sys", @@ -8717,10 +8917,9 @@ dependencies = [ "gtk-sys", "javascriptcore-rs-sys", "libc", - "pango-sys", "pkg-config", - "soup2-sys", - "system-deps 6.2.2", + "soup3-sys", + "system-deps", ] [[package]] @@ -8734,48 +8933,38 @@ dependencies = [ [[package]] name = "webview2-com" -version = "0.19.1" +version = "0.33.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b4a769c9f1a64a8734bde70caafac2b96cada12cd4aefa49196b3a386b8b4178" +checksum = "6f61ff3d9d0ee4efcb461b14eb3acfda2702d10dc329f339303fc3e57215ae2c" dependencies = [ "webview2-com-macros", "webview2-com-sys", - "windows 0.39.0", - "windows-implement 0.39.0", -] - -[[package]] -name = "webview2-com-bridge" -version = "0.1.0" -dependencies = [ - "webview2-com", - "windows 0.39.0", + "windows 0.58.0", + "windows-core 0.58.0", + "windows-implement 0.58.0", + "windows-interface 0.58.0", ] [[package]] name = "webview2-com-macros" -version = "0.6.0" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eaebe196c01691db62e9e4ca52c5ef1e4fd837dcae27dae3ada599b5a8fd05ac" +checksum = "1d228f15bba3b9d56dde8bddbee66fa24545bd17b48d5128ccf4a8742b18e431" dependencies = [ "proc-macro2", "quote", - "syn 1.0.109", + "syn 2.0.77", ] [[package]] name = "webview2-com-sys" -version = "0.19.0" +version = "0.33.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aac48ef20ddf657755fdcda8dfed2a7b4fc7e4581acce6fe9b88c3d64f29dee7" +checksum = "a3a3e2eeb58f82361c93f9777014668eb3d07e7d174ee4c819575a9208011886" dependencies = [ - "regex", - "serde", - "serde_json", "thiserror", - "windows 0.39.0", - "windows-bindgen", - "windows-metadata", + "windows 0.58.0", + "windows-core 0.58.0", ] [[package]] @@ -8793,7 +8982,7 @@ dependencies = [ "either", "home", "once_cell", - "rustix 0.38.35", + "rustix 0.38.36", ] [[package]] @@ -8804,7 +8993,7 @@ checksum = "b4ee928febd44d98f2f459a4a79bd4d928591333a494a10a868418ac1b39cf1f" dependencies = [ "either", "home", - "rustix 0.38.35", + "rustix 0.38.36", "winsafe", ] @@ -8862,58 +9051,20 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" -[[package]] -name = "window-shadows" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67ff424735b1ac21293b0492b069394b0a189c8a463fb015a16dea7c2e221c08" -dependencies = [ - "cocoa 0.25.0", - "objc", - "raw-window-handle 0.5.2", - "windows-sys 0.48.0", -] - [[package]] name = "window-vibrancy" -version = "0.5.1" +version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d8cdd6999298d969289d8078dae02ce798ad23452075985cccba8b6326711ecf" +checksum = "3ea403deff7b51fff19e261330f71608ff2cdef5721d72b64180bb95be7c4150" dependencies = [ - "cocoa 0.26.0", - "objc", - "raw-window-handle 0.6.2", + "objc2", + "objc2-app-kit", + "objc2-foundation", + "raw-window-handle", "windows-sys 0.59.0", "windows-version", ] -[[package]] -name = "windows" -version = "0.37.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57b543186b344cc61c85b5aab0d2e3adf4e0f99bc076eff9aa5927bcc0b8a647" -dependencies = [ - "windows_aarch64_msvc 0.37.0", - "windows_i686_gnu 0.37.0", - "windows_i686_msvc 0.37.0", - "windows_x86_64_gnu 0.37.0", - "windows_x86_64_msvc 0.37.0", -] - -[[package]] -name = "windows" -version = "0.39.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1c4bd0a50ac6020f65184721f758dba47bb9fbc2133df715ec74a237b26794a" -dependencies = [ - "windows-implement 0.39.0", - "windows_aarch64_msvc 0.39.0", - "windows_i686_gnu 0.39.0", - "windows_i686_msvc 0.39.0", - "windows_x86_64_gnu 0.39.0", - "windows_x86_64_msvc 0.39.0", -] - [[package]] name = "windows" version = "0.48.0" @@ -8963,16 +9114,6 @@ dependencies = [ "windows-targets 0.52.6", ] -[[package]] -name = "windows-bindgen" -version = "0.39.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68003dbd0e38abc0fb85b939240f4bce37c43a5981d3df37ccbaaa981b47cb41" -dependencies = [ - "windows-metadata", - "windows-tokens", -] - [[package]] name = "windows-core" version = "0.52.0" @@ -9019,16 +9160,6 @@ dependencies = [ "windows-targets 0.52.6", ] -[[package]] -name = "windows-implement" -version = "0.39.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba01f98f509cb5dc05f4e5fc95e535f78260f15fea8fe1a8abdd08f774f1cee7" -dependencies = [ - "syn 1.0.109", - "windows-tokens", -] - [[package]] name = "windows-implement" version = "0.56.0" @@ -9095,12 +9226,6 @@ dependencies = [ "syn 2.0.77", ] -[[package]] -name = "windows-metadata" -version = "0.39.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ee5e275231f07c6e240d14f34e1b635bf1faa1c76c57cfd59a5cdb9848e4278" - [[package]] name = "windows-registry" version = "0.2.0" @@ -9142,17 +9267,11 @@ dependencies = [ [[package]] name = "windows-sys" -version = "0.42.0" +version = "0.45.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a3e1820f08b8513f676f7ab6c1f99ff312fb97b553d30ff4dd86f9f15728aa7" +checksum = "75283be5efb2831d37ea142365f009c02ec203cd29a3ebecbc093d52315b66d0" dependencies = [ - "windows_aarch64_gnullvm 0.42.2", - "windows_aarch64_msvc 0.42.2", - "windows_i686_gnu 0.42.2", - "windows_i686_msvc 0.42.2", - "windows_x86_64_gnu 0.42.2", - "windows_x86_64_gnullvm 0.42.2", - "windows_x86_64_msvc 0.42.2", + "windows-targets 0.42.2", ] [[package]] @@ -9182,6 +9301,21 @@ dependencies = [ "windows-targets 0.52.6", ] +[[package]] +name = "windows-targets" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e5180c00cd44c9b1c88adb3693291f1cd93605ded80c250a75d472756b4d071" +dependencies = [ + "windows_aarch64_gnullvm 0.42.2", + "windows_aarch64_msvc 0.42.2", + "windows_i686_gnu 0.42.2", + "windows_i686_msvc 0.42.2", + "windows_x86_64_gnu 0.42.2", + "windows_x86_64_gnullvm 0.42.2", + "windows_x86_64_msvc 0.42.2", +] + [[package]] name = "windows-targets" version = "0.48.5" @@ -9213,12 +9347,6 @@ dependencies = [ "windows_x86_64_msvc 0.52.6", ] -[[package]] -name = "windows-tokens" -version = "0.39.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f838de2fe15fe6bac988e74b798f26499a8b21a9d97edec321e79b28d1d7f597" - [[package]] name = "windows-version" version = "0.1.1" @@ -9246,18 +9374,6 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" -[[package]] -name = "windows_aarch64_msvc" -version = "0.37.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2623277cb2d1c216ba3b578c0f3cf9cdebeddb6e66b1b218bb33596ea7769c3a" - -[[package]] -name = "windows_aarch64_msvc" -version = "0.39.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec7711666096bd4096ffa835238905bb33fb87267910e154b18b44eaabb340f2" - [[package]] name = "windows_aarch64_msvc" version = "0.42.2" @@ -9276,18 +9392,6 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" -[[package]] -name = "windows_i686_gnu" -version = "0.37.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3925fd0b0b804730d44d4b6278c50f9699703ec49bcd628020f46f4ba07d9e1" - -[[package]] -name = "windows_i686_gnu" -version = "0.39.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "763fc57100a5f7042e3057e7e8d9bdd7860d330070251a73d003563a3bb49e1b" - [[package]] name = "windows_i686_gnu" version = "0.42.2" @@ -9312,18 +9416,6 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" -[[package]] -name = "windows_i686_msvc" -version = "0.37.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce907ac74fe331b524c1298683efbf598bb031bc84d5e274db2083696d07c57c" - -[[package]] -name = "windows_i686_msvc" -version = "0.39.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7bc7cbfe58828921e10a9f446fcaaf649204dcfe6c1ddd712c5eebae6bda1106" - [[package]] name = "windows_i686_msvc" version = "0.42.2" @@ -9342,18 +9434,6 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" -[[package]] -name = "windows_x86_64_gnu" -version = "0.37.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2babfba0828f2e6b32457d5341427dcbb577ceef556273229959ac23a10af33d" - -[[package]] -name = "windows_x86_64_gnu" -version = "0.39.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6868c165637d653ae1e8dc4d82c25d4f97dd6605eaa8d784b5c6e0ab2a252b65" - [[package]] name = "windows_x86_64_gnu" version = "0.42.2" @@ -9390,18 +9470,6 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" -[[package]] -name = "windows_x86_64_msvc" -version = "0.37.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f4dd6dc7df2d84cf7b33822ed5b86318fb1781948e9663bacd047fc9dd52259d" - -[[package]] -name = "windows_x86_64_msvc" -version = "0.39.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e4d40883ae9cae962787ca76ba76390ffa29214667a111db9e0a1ad8377e809" - [[package]] name = "windows_x86_64_msvc" version = "0.42.2" @@ -9429,15 +9497,6 @@ dependencies = [ "memchr", ] -[[package]] -name = "winnow" -version = "0.6.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68a9bda4691f099d435ad181000724da8e5899daa10713c2d432552b9ccd3a6f" -dependencies = [ - "memchr", -] - [[package]] name = "winreg" version = "0.10.1" @@ -9447,16 +9506,6 @@ dependencies = [ "winapi", ] -[[package]] -name = "winreg" -version = "0.50.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "524e57b2c537c0f9b1e69f1965311ec12182b4122e45035b1508cd24d2adadb1" -dependencies = [ - "cfg-if", - "windows-sys 0.48.0", -] - [[package]] name = "winreg" version = "0.52.0" @@ -9473,26 +9522,6 @@ version = "0.0.19" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d135d17ab770252ad95e9a872d365cf3090e3be864a34ab46f48555993efc904" -[[package]] -name = "wl-clipboard-rs" -version = "0.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "12b41773911497b18ca8553c3daaf8ec9fe9819caf93d451d3055f69de028adb" -dependencies = [ - "derive-new", - "libc", - "log", - "nix 0.28.0", - "os_pipe", - "tempfile", - "thiserror", - "tree_magic_mini", - "wayland-backend", - "wayland-client", - "wayland-protocols", - "wayland-protocols-wlr", -] - [[package]] name = "write16" version = "1.0.0" @@ -9507,40 +9536,42 @@ checksum = "1e9df38ee2d2c3c5948ea468a8406ff0db0b29ae1ffde1bcf20ef305bcc95c51" [[package]] name = "wry" -version = "0.24.11" +version = "0.43.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c55c80b12287eb1ff7c365fc2f7a5037cb6181bd44c9fce81c8d1cf7605ffad6" +checksum = "f4d715cf5fe88e9647f3d17b207b6d060d4a88e7171d4ccb2d2c657dd1d44728" dependencies = [ - "base64 0.13.1", + "base64 0.22.1", "block", - "cocoa 0.24.1", - "core-graphics 0.22.3", + "cocoa", + "core-graphics 0.24.0", "crossbeam-channel", + "dpi", "dunce", - "gdk", - "gio", - "glib", + "gdkx11", "gtk", "html5ever", - "http 0.2.12", + "http 1.1.0", + "javascriptcore-rs", + "jni", "kuchikiki", "libc", - "log", + "ndk", "objc", "objc_id", "once_cell", - "serde", - "serde_json", + "percent-encoding", + "raw-window-handle", "sha2 0.10.8", - "soup2", - "tao", + "soup3", + "tao-macros", "thiserror", - "url", "webkit2gtk", "webkit2gtk-sys", "webview2-com", - "windows 0.39.0", - "windows-implement 0.39.0", + "windows 0.58.0", + "windows-core 0.58.0", + "windows-version", + "x11-dl", ] [[package]] @@ -9570,8 +9601,8 @@ version = "0.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5d91ffca73ee7f68ce055750bf9f6eca0780b8c85eff9bc046a3b0da41755e12" dependencies = [ - "gethostname", - "rustix 0.38.35", + "gethostname 0.4.3", + "rustix 0.38.36", "x11rb-protocol", ] @@ -9589,7 +9620,7 @@ checksum = "8da84f1a25939b27f6820d92aed108f83ff920fdf11a7b19366c27c4cda81d4f" dependencies = [ "libc", "linux-raw-sys 0.4.14", - "rustix 0.38.35", + "rustix 0.38.36", ] [[package]] @@ -9663,9 +9694,9 @@ dependencies = [ [[package]] name = "zbus" -version = "4.4.0" +version = "4.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bb97012beadd29e654708a0fdb4c84bc046f537aecfde2c3ee0a9e4b4d48c725" +checksum = "7b8e3d6ae3342792a6cc2340e4394334c7402f3d793b390d2c5494a4032b3030" dependencies = [ "async-broadcast", "async-executor", @@ -9677,19 +9708,21 @@ dependencies = [ "async-task", "async-trait", "blocking", + "derivative", "enumflags2", "event-listener 5.3.0", "futures-core", "futures-sink", "futures-util", "hex", - "nix 0.29.0", + "nix 0.27.1", "ordered-stream", "rand 0.8.5", "serde", "serde_repr", "sha1", "static_assertions", + "tokio", "tracing", "uds_windows", "windows-sys 0.52.0", @@ -9701,14 +9734,15 @@ dependencies = [ [[package]] name = "zbus_macros" -version = "4.4.0" +version = "4.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "267db9407081e90bbfa46d841d3cbc60f59c0351838c4bc65199ecd79ab1983e" +checksum = "b7a3e850ff1e7217a3b7a07eba90d37fe9bb9e89a310f718afcde5885ca9b6d7" dependencies = [ - "proc-macro-crate 3.2.0", + "proc-macro-crate 1.3.1", "proc-macro2", "quote", - "syn 2.0.77", + "regex", + "syn 1.0.109", "zvariant_utils", ] @@ -9807,17 +9841,6 @@ dependencies = [ "syn 2.0.77", ] -[[package]] -name = "zip" -version = "0.6.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "760394e246e4c28189f19d488c058bf16f564016aefac5d32bb1f3b51d5e9261" -dependencies = [ - "byteorder", - "crc32fast", - "crossbeam-utils", -] - [[package]] name = "zip" version = "2.2.0" @@ -9853,7 +9876,7 @@ version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "386508a00aae1d8218b9252a41f59bba739ccee3f8e420bb90bcb1c30d960d4a" dependencies = [ - "zip 2.2.0", + "zip", ] [[package]] @@ -9924,37 +9947,38 @@ dependencies = [ [[package]] name = "zvariant" -version = "4.2.0" +version = "4.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2084290ab9a1c471c38fc524945837734fbf124487e105daec2bb57fd48c81fe" +checksum = "4e09e8be97d44eeab994d752f341e67b3b0d80512a8b315a0671d47232ef1b65" dependencies = [ "endi", "enumflags2", "serde", "static_assertions", + "url", "zvariant_derive", ] [[package]] name = "zvariant_derive" -version = "4.2.0" +version = "4.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "73e2ba546bda683a90652bac4a279bc146adad1386f25379cf73200d2002c449" +checksum = "72a5857e2856435331636a9fbb415b09243df4521a267c5bedcd5289b4d5799e" dependencies = [ - "proc-macro-crate 3.2.0", + "proc-macro-crate 1.3.1", "proc-macro2", "quote", - "syn 2.0.77", + "syn 1.0.109", "zvariant_utils", ] [[package]] name = "zvariant_utils" -version = "2.1.0" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c51bcff7cc3dbb5055396bcf774748c3dab426b4b8659046963523cee4808340" +checksum = "00bedb16a193cc12451873fee2a1bc6550225acece0e36f333e68326c73c8172" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 1.0.109", ] diff --git a/clash-nyanpasu/backend/Cargo.toml b/clash-nyanpasu/backend/Cargo.toml index 0733074b44..50094456d9 100644 --- a/clash-nyanpasu/backend/Cargo.toml +++ b/clash-nyanpasu/backend/Cargo.toml @@ -1,6 +1,6 @@ [workspace] resolver = "2" -members = ["tauri", "webview2-com-bridge", "boa_utils"] +members = ["tauri", "boa_utils"] [workspace.package] repository = "https://github.com/keiko233/clash-nyanpasu.git" @@ -11,7 +11,7 @@ authors = ["zzzgydi", "keiko233"] [workspace.dependencies] thiserror = "1" tracing = "0.1" -boa_engine = "0.19" +boa_engine = { version = "0.19", git = "https://github.com/boa-dev/boa.git", branch = "backport-0.19-fixes" } [profile.release] panic = "unwind" diff --git a/clash-nyanpasu/backend/Cross.toml b/clash-nyanpasu/backend/Cross.toml index 5a13089605..6b37d72250 100644 --- a/clash-nyanpasu/backend/Cross.toml +++ b/clash-nyanpasu/backend/Cross.toml @@ -3,8 +3,8 @@ image = "ghcr.io/cross-rs/aarch64-unknown-linux-gnu:edge" pre-build = [ "dpkg --add-architecture $CROSS_DEB_ARCH", """apt-get update && apt-get -y install \ - libwebkit2gtk-4.0-dev:$CROSS_DEB_ARCH \ - libgtk-3-dev:$CROSS_DEB_ARCH \ + libwebkit2gtk-4.1-dev:$CROSS_DEB_ARCH \ + libxdo-dev:$CROSS_DEB_ARCH \ libayatana-appindicator3-dev:$CROSS_DEB_ARCH \ librsvg2-dev:$CROSS_DEB_ARCH \ libpango1.0-dev:$CROSS_DEB_ARCH \ diff --git a/clash-nyanpasu/backend/boa_utils/Cargo.toml b/clash-nyanpasu/backend/boa_utils/Cargo.toml index d6466edac9..c480b0e45b 100644 --- a/clash-nyanpasu/backend/boa_utils/Cargo.toml +++ b/clash-nyanpasu/backend/boa_utils/Cargo.toml @@ -9,8 +9,8 @@ authors.workspace = true [dependencies] rustc-hash = { version = "2", features = ["std"] } boa_engine.workspace = true -boa_gc = "0.19" -boa_parser = "0.19" +boa_gc = { version = "0.19", git = "https://github.com/boa-dev/boa.git", branch = "backport-0.19-fixes" } +boa_parser = { version = "0.19", git = "https://github.com/boa-dev/boa.git", branch = "backport-0.19-fixes" } isahc = "1.7" futures-util = "0.3" smol = "2" diff --git a/clash-nyanpasu/backend/tauri/Cargo.toml b/clash-nyanpasu/backend/tauri/Cargo.toml index 626e7811a9..0c98355bf5 100644 --- a/clash-nyanpasu/backend/tauri/Cargo.toml +++ b/clash-nyanpasu/backend/tauri/Cargo.toml @@ -9,8 +9,12 @@ default-run = "clash-nyanpasu" edition = { workspace = true } build = "build.rs" +[lib] +name = "app_lib" +crate-type = ["staticlib", "cdylib", "rlib"] + [build-dependencies] -tauri-build = { version = "1", features = [] } +tauri-build = { version = "2.0.0-rc", features = [] } serde = "1" simd-json = "0.13" chrono = "0.4" @@ -46,26 +50,10 @@ tokio = { version = "1", features = ["full"] } serde = { version = "1.0", features = ["derive"] } reqwest = { version = "0.12", features = ["json", "rustls-tls", "stream"] } relative-path = "1.9" -tauri = { version = "1.5.4", features = [ - "dialog-all", - "updater", - "fs-all", - "clipboard-all", - "os-all", - "global-shortcut-all", - "notification-all", - "process-all", - "shell-all", - "system-tray", - "window-all", -] } -window-vibrancy = { version = "0.5.0" } -window-shadows = { version = "0.2.2" } axum = "0.7" mime = "0.3" bincode = "1" bytes = { version = "1", features = ["serde"] } -wry = { version = "0.24.6" } semver = "1.0" zip = "2.0.0" zip-extensions = "0.8.0" @@ -81,7 +69,11 @@ runas = { git = "https://github.com/libnyanpasu/rust-runas.git" } backon = { version = "1.0.1", features = ["tokio-sleep"] } rust-i18n = "3" adler = "1.0.2" -rfd = "0.10" # should bump to v0.14 when clarify why the rfd v0.10 from tauri breaks build +rfd = { version = "0.14", default-features = false, features = [ + "tokio", + "gtk3", + "common-controls-v6", +] } indexmap = { version = "2.2.3", features = ["serde"] } tracing = { workspace = true } tracing-attributes = "0.1" @@ -96,7 +88,6 @@ tracing-log = { version = "0.2" } tracing-appender = { version = "0.2", features = ["parking_lot"] } base64 = "0.22" single-instance = "0.3.3" -tauri-plugin-deep-link = { path = "../tauri-plugin-deep-link", version = "0.1.2" } uuid = "1.7.0" image = "0.25.0" fast_image_resize = "4" @@ -138,12 +129,33 @@ mlua = { version = "0.9", features = [ ] } enumflags2 = "0.7" sha2 = "0.10" +bimap = "0.6.3" + +# Tauri Dependencies +tauri = { version = "2.0.0-rc", features = [ + "tray-icon", + "image-png", + "image-ico", +] } +tauri-plugin-deep-link = { path = "../tauri-plugin-deep-link", version = "0.1.2" } +tauri-plugin-os = { git = "https://github.com/tauri-apps/plugins-workspace", branch = "v2" } +tauri-plugin-clipboard-manager = { git = "https://github.com/tauri-apps/plugins-workspace", branch = "v2" } +tauri-plugin-fs = { git = "https://github.com/tauri-apps/plugins-workspace", branch = "v2" } +tauri-plugin-dialog = { git = "https://github.com/tauri-apps/plugins-workspace", branch = "v2" } +tauri-plugin-process = { git = "https://github.com/tauri-apps/plugins-workspace", branch = "v2" } +tauri-plugin-updater = { git = "https://github.com/tauri-apps/plugins-workspace", branch = "v2" } +tauri-plugin-shell = { git = "https://github.com/tauri-apps/plugins-workspace", branch = "v2" } +tauri-plugin-notification = { git = "https://github.com/tauri-apps/plugins-workspace", branch = "v2" } +window-vibrancy = { version = "0.5.2" } + +[target."cfg(not(any(target_os = \"android\", target_os = \"ios\")))".dependencies] +tauri-plugin-global-shortcut = { git = "https://github.com/tauri-apps/plugins-workspace", branch = "v2" } [target.'cfg(all(target_os = "linux", target_arch = "aarch64"))'.dependencies] openssl = { version = "0.10", features = ["vendored"] } [target.'cfg(target_os = "macos")'.dependencies] -cocoa = "0.25.0" +cocoa = "0.26.0" objc = "0.2.7" [target.'cfg(windows)'.dependencies] @@ -153,34 +165,8 @@ windows-sys = { version = "0.59", features = [ "Win32_System_LibraryLoader", "Win32_System_SystemInformation", ] } -webview2-com-bridge = { path = "../webview2-com-bridge" } - -[target.'cfg(windows)'.dependencies.tauri] -version = "1.5.4" -features = [ - "global-shortcut-all", - "icon-png", - "process-all", - "dialog-all", - "shell-all", - "system-tray", - "updater", - "window-all", -] - -[target.'cfg(linux)'.dependencies.tauri] -version = "1.5.4" -features = [ - "global-shortcut-all", - "process-all", - "dialog-all", - "shell-all", - "system-tray", - "updater", - "window-all", - "native-tls-vendored", - "reqwest-native-tls-vendored", -] +windows-core = "0.58.0" +webview2-com = "0.33" [features] default = ["custom-protocol", "default-meta"] diff --git a/clash-nyanpasu/backend/tauri/capabilities/main.json b/clash-nyanpasu/backend/tauri/capabilities/main.json new file mode 100644 index 0000000000..e0d0170c01 --- /dev/null +++ b/clash-nyanpasu/backend/tauri/capabilities/main.json @@ -0,0 +1,5 @@ +{ + "$schema": "../gen/schemas/desktop-schema.json", + "identifier": "main-capability", + "permissions": ["updater:default"] +} diff --git a/clash-nyanpasu/backend/tauri/capabilities/migrated.json b/clash-nyanpasu/backend/tauri/capabilities/migrated.json new file mode 100644 index 0000000000..0e1f27d4be --- /dev/null +++ b/clash-nyanpasu/backend/tauri/capabilities/migrated.json @@ -0,0 +1,76 @@ +{ + "identifier": "migrated", + "description": "permissions that were migrated from v1", + "local": true, + "windows": ["main"], + "permissions": [ + "core:default", + "fs:allow-read-file", + "fs:allow-write-file", + "fs:allow-read-dir", + "fs:allow-copy-file", + "fs:allow-mkdir", + "fs:allow-remove", + "fs:allow-remove", + "fs:allow-rename", + "fs:allow-exists", + "core:window:allow-create", + "core:window:allow-center", + "core:window:allow-request-user-attention", + "core:window:allow-set-resizable", + "core:window:allow-set-maximizable", + "core:window:allow-set-minimizable", + "core:window:allow-set-closable", + "core:window:allow-set-title", + "core:window:allow-maximize", + "core:window:allow-unmaximize", + "core:window:allow-minimize", + "core:window:allow-unminimize", + "core:window:allow-show", + "core:window:allow-hide", + "core:window:allow-close", + "core:window:allow-set-decorations", + "core:window:allow-set-always-on-top", + "core:window:allow-set-content-protected", + "core:window:allow-set-size", + "core:window:allow-set-min-size", + "core:window:allow-set-max-size", + "core:window:allow-set-position", + "core:window:allow-set-fullscreen", + "core:window:allow-set-focus", + "core:window:allow-set-icon", + "core:window:allow-set-skip-taskbar", + "core:window:allow-set-cursor-grab", + "core:window:allow-set-cursor-visible", + "core:window:allow-set-cursor-icon", + "core:window:allow-set-cursor-position", + "core:window:allow-set-ignore-cursor-events", + "core:window:allow-start-dragging", + "core:webview:allow-print", + "shell:allow-execute", + "shell:allow-open", + "dialog:allow-open", + "dialog:allow-save", + "dialog:allow-message", + "dialog:allow-ask", + "dialog:allow-confirm", + "notification:default", + "global-shortcut:allow-is-registered", + "global-shortcut:allow-register", + "global-shortcut:allow-register-all", + "global-shortcut:allow-unregister", + "global-shortcut:allow-unregister-all", + "os:allow-platform", + "os:allow-version", + "os:allow-os-type", + "os:allow-family", + "os:allow-arch", + "os:allow-exe-extension", + "os:allow-locale", + "os:allow-hostname", + "process:allow-restart", + "process:allow-exit", + "clipboard-manager:allow-read-text", + "clipboard-manager:allow-write-text" + ] +} diff --git a/clash-nyanpasu/backend/tauri/gen/schemas/acl-manifests.json b/clash-nyanpasu/backend/tauri/gen/schemas/acl-manifests.json new file mode 100644 index 0000000000..823057c724 --- /dev/null +++ b/clash-nyanpasu/backend/tauri/gen/schemas/acl-manifests.json @@ -0,0 +1 @@ +{"clipboard-manager":{"default_permission":{"identifier":"default","description":"No features are enabled by default, as we believe\nthe clipboard can be inherently dangerous and it is \napplication specific if read and/or write access is needed.\n\nClipboard interaction needs to be explicitly enabled.\n","permissions":[]},"permissions":{"allow-clear":{"identifier":"allow-clear","description":"Enables the clear command without any pre-configured scope.","commands":{"allow":["clear"],"deny":[]}},"allow-read-image":{"identifier":"allow-read-image","description":"Enables the read_image command without any pre-configured scope.","commands":{"allow":["read_image"],"deny":[]}},"allow-read-text":{"identifier":"allow-read-text","description":"Enables the read_text command without any pre-configured scope.","commands":{"allow":["read_text"],"deny":[]}},"allow-write-html":{"identifier":"allow-write-html","description":"Enables the write_html command without any pre-configured scope.","commands":{"allow":["write_html"],"deny":[]}},"allow-write-image":{"identifier":"allow-write-image","description":"Enables the write_image command without any pre-configured scope.","commands":{"allow":["write_image"],"deny":[]}},"allow-write-text":{"identifier":"allow-write-text","description":"Enables the write_text command without any pre-configured scope.","commands":{"allow":["write_text"],"deny":[]}},"deny-clear":{"identifier":"deny-clear","description":"Denies the clear command without any pre-configured scope.","commands":{"allow":[],"deny":["clear"]}},"deny-read-image":{"identifier":"deny-read-image","description":"Denies the read_image command without any pre-configured scope.","commands":{"allow":[],"deny":["read_image"]}},"deny-read-text":{"identifier":"deny-read-text","description":"Denies the read_text command without any pre-configured scope.","commands":{"allow":[],"deny":["read_text"]}},"deny-write-html":{"identifier":"deny-write-html","description":"Denies the write_html command without any pre-configured scope.","commands":{"allow":[],"deny":["write_html"]}},"deny-write-image":{"identifier":"deny-write-image","description":"Denies the write_image command without any pre-configured scope.","commands":{"allow":[],"deny":["write_image"]}},"deny-write-text":{"identifier":"deny-write-text","description":"Denies the write_text command without any pre-configured scope.","commands":{"allow":[],"deny":["write_text"]}}},"permission_sets":{},"global_scope_schema":null},"core:app":{"default_permission":{"identifier":"default","description":"Default permissions for the plugin.","permissions":["allow-version","allow-name","allow-tauri-version"]},"permissions":{"allow-app-hide":{"identifier":"allow-app-hide","description":"Enables the app_hide command without any pre-configured scope.","commands":{"allow":["app_hide"],"deny":[]}},"allow-app-show":{"identifier":"allow-app-show","description":"Enables the app_show command without any pre-configured scope.","commands":{"allow":["app_show"],"deny":[]}},"allow-default-window-icon":{"identifier":"allow-default-window-icon","description":"Enables the default_window_icon command without any pre-configured scope.","commands":{"allow":["default_window_icon"],"deny":[]}},"allow-name":{"identifier":"allow-name","description":"Enables the name command without any pre-configured scope.","commands":{"allow":["name"],"deny":[]}},"allow-tauri-version":{"identifier":"allow-tauri-version","description":"Enables the tauri_version command without any pre-configured scope.","commands":{"allow":["tauri_version"],"deny":[]}},"allow-version":{"identifier":"allow-version","description":"Enables the version command without any pre-configured scope.","commands":{"allow":["version"],"deny":[]}},"deny-app-hide":{"identifier":"deny-app-hide","description":"Denies the app_hide command without any pre-configured scope.","commands":{"allow":[],"deny":["app_hide"]}},"deny-app-show":{"identifier":"deny-app-show","description":"Denies the app_show command without any pre-configured scope.","commands":{"allow":[],"deny":["app_show"]}},"deny-default-window-icon":{"identifier":"deny-default-window-icon","description":"Denies the default_window_icon command without any pre-configured scope.","commands":{"allow":[],"deny":["default_window_icon"]}},"deny-name":{"identifier":"deny-name","description":"Denies the name command without any pre-configured scope.","commands":{"allow":[],"deny":["name"]}},"deny-tauri-version":{"identifier":"deny-tauri-version","description":"Denies the tauri_version command without any pre-configured scope.","commands":{"allow":[],"deny":["tauri_version"]}},"deny-version":{"identifier":"deny-version","description":"Denies the version command without any pre-configured scope.","commands":{"allow":[],"deny":["version"]}}},"permission_sets":{},"global_scope_schema":null},"core:event":{"default_permission":{"identifier":"default","description":"Default permissions for the plugin.","permissions":["allow-listen","allow-unlisten","allow-emit","allow-emit-to"]},"permissions":{"allow-emit":{"identifier":"allow-emit","description":"Enables the emit command without any pre-configured scope.","commands":{"allow":["emit"],"deny":[]}},"allow-emit-to":{"identifier":"allow-emit-to","description":"Enables the emit_to command without any pre-configured scope.","commands":{"allow":["emit_to"],"deny":[]}},"allow-listen":{"identifier":"allow-listen","description":"Enables the listen command without any pre-configured scope.","commands":{"allow":["listen"],"deny":[]}},"allow-unlisten":{"identifier":"allow-unlisten","description":"Enables the unlisten command without any pre-configured scope.","commands":{"allow":["unlisten"],"deny":[]}},"deny-emit":{"identifier":"deny-emit","description":"Denies the emit command without any pre-configured scope.","commands":{"allow":[],"deny":["emit"]}},"deny-emit-to":{"identifier":"deny-emit-to","description":"Denies the emit_to command without any pre-configured scope.","commands":{"allow":[],"deny":["emit_to"]}},"deny-listen":{"identifier":"deny-listen","description":"Denies the listen command without any pre-configured scope.","commands":{"allow":[],"deny":["listen"]}},"deny-unlisten":{"identifier":"deny-unlisten","description":"Denies the unlisten command without any pre-configured scope.","commands":{"allow":[],"deny":["unlisten"]}}},"permission_sets":{},"global_scope_schema":null},"core:image":{"default_permission":{"identifier":"default","description":"Default permissions for the plugin.","permissions":["allow-new","allow-from-bytes","allow-from-path","allow-rgba","allow-size"]},"permissions":{"allow-from-bytes":{"identifier":"allow-from-bytes","description":"Enables the from_bytes command without any pre-configured scope.","commands":{"allow":["from_bytes"],"deny":[]}},"allow-from-path":{"identifier":"allow-from-path","description":"Enables the from_path command without any pre-configured scope.","commands":{"allow":["from_path"],"deny":[]}},"allow-new":{"identifier":"allow-new","description":"Enables the new command without any pre-configured scope.","commands":{"allow":["new"],"deny":[]}},"allow-rgba":{"identifier":"allow-rgba","description":"Enables the rgba command without any pre-configured scope.","commands":{"allow":["rgba"],"deny":[]}},"allow-size":{"identifier":"allow-size","description":"Enables the size command without any pre-configured scope.","commands":{"allow":["size"],"deny":[]}},"deny-from-bytes":{"identifier":"deny-from-bytes","description":"Denies the from_bytes command without any pre-configured scope.","commands":{"allow":[],"deny":["from_bytes"]}},"deny-from-path":{"identifier":"deny-from-path","description":"Denies the from_path command without any pre-configured scope.","commands":{"allow":[],"deny":["from_path"]}},"deny-new":{"identifier":"deny-new","description":"Denies the new command without any pre-configured scope.","commands":{"allow":[],"deny":["new"]}},"deny-rgba":{"identifier":"deny-rgba","description":"Denies the rgba command without any pre-configured scope.","commands":{"allow":[],"deny":["rgba"]}},"deny-size":{"identifier":"deny-size","description":"Denies the size command without any pre-configured scope.","commands":{"allow":[],"deny":["size"]}}},"permission_sets":{},"global_scope_schema":null},"core:menu":{"default_permission":{"identifier":"default","description":"Default permissions for the plugin.","permissions":["allow-new","allow-append","allow-prepend","allow-insert","allow-remove","allow-remove-at","allow-items","allow-get","allow-popup","allow-create-default","allow-set-as-app-menu","allow-set-as-window-menu","allow-text","allow-set-text","allow-is-enabled","allow-set-enabled","allow-set-accelerator","allow-set-as-windows-menu-for-nsapp","allow-set-as-help-menu-for-nsapp","allow-is-checked","allow-set-checked","allow-set-icon"]},"permissions":{"allow-append":{"identifier":"allow-append","description":"Enables the append command without any pre-configured scope.","commands":{"allow":["append"],"deny":[]}},"allow-create-default":{"identifier":"allow-create-default","description":"Enables the create_default command without any pre-configured scope.","commands":{"allow":["create_default"],"deny":[]}},"allow-get":{"identifier":"allow-get","description":"Enables the get command without any pre-configured scope.","commands":{"allow":["get"],"deny":[]}},"allow-insert":{"identifier":"allow-insert","description":"Enables the insert command without any pre-configured scope.","commands":{"allow":["insert"],"deny":[]}},"allow-is-checked":{"identifier":"allow-is-checked","description":"Enables the is_checked command without any pre-configured scope.","commands":{"allow":["is_checked"],"deny":[]}},"allow-is-enabled":{"identifier":"allow-is-enabled","description":"Enables the is_enabled command without any pre-configured scope.","commands":{"allow":["is_enabled"],"deny":[]}},"allow-items":{"identifier":"allow-items","description":"Enables the items command without any pre-configured scope.","commands":{"allow":["items"],"deny":[]}},"allow-new":{"identifier":"allow-new","description":"Enables the new command without any pre-configured scope.","commands":{"allow":["new"],"deny":[]}},"allow-popup":{"identifier":"allow-popup","description":"Enables the popup command without any pre-configured scope.","commands":{"allow":["popup"],"deny":[]}},"allow-prepend":{"identifier":"allow-prepend","description":"Enables the prepend command without any pre-configured scope.","commands":{"allow":["prepend"],"deny":[]}},"allow-remove":{"identifier":"allow-remove","description":"Enables the remove command without any pre-configured scope.","commands":{"allow":["remove"],"deny":[]}},"allow-remove-at":{"identifier":"allow-remove-at","description":"Enables the remove_at command without any pre-configured scope.","commands":{"allow":["remove_at"],"deny":[]}},"allow-set-accelerator":{"identifier":"allow-set-accelerator","description":"Enables the set_accelerator command without any pre-configured scope.","commands":{"allow":["set_accelerator"],"deny":[]}},"allow-set-as-app-menu":{"identifier":"allow-set-as-app-menu","description":"Enables the set_as_app_menu command without any pre-configured scope.","commands":{"allow":["set_as_app_menu"],"deny":[]}},"allow-set-as-help-menu-for-nsapp":{"identifier":"allow-set-as-help-menu-for-nsapp","description":"Enables the set_as_help_menu_for_nsapp command without any pre-configured scope.","commands":{"allow":["set_as_help_menu_for_nsapp"],"deny":[]}},"allow-set-as-window-menu":{"identifier":"allow-set-as-window-menu","description":"Enables the set_as_window_menu command without any pre-configured scope.","commands":{"allow":["set_as_window_menu"],"deny":[]}},"allow-set-as-windows-menu-for-nsapp":{"identifier":"allow-set-as-windows-menu-for-nsapp","description":"Enables the set_as_windows_menu_for_nsapp command without any pre-configured scope.","commands":{"allow":["set_as_windows_menu_for_nsapp"],"deny":[]}},"allow-set-checked":{"identifier":"allow-set-checked","description":"Enables the set_checked command without any pre-configured scope.","commands":{"allow":["set_checked"],"deny":[]}},"allow-set-enabled":{"identifier":"allow-set-enabled","description":"Enables the set_enabled command without any pre-configured scope.","commands":{"allow":["set_enabled"],"deny":[]}},"allow-set-icon":{"identifier":"allow-set-icon","description":"Enables the set_icon command without any pre-configured scope.","commands":{"allow":["set_icon"],"deny":[]}},"allow-set-text":{"identifier":"allow-set-text","description":"Enables the set_text command without any pre-configured scope.","commands":{"allow":["set_text"],"deny":[]}},"allow-text":{"identifier":"allow-text","description":"Enables the text command without any pre-configured scope.","commands":{"allow":["text"],"deny":[]}},"deny-append":{"identifier":"deny-append","description":"Denies the append command without any pre-configured scope.","commands":{"allow":[],"deny":["append"]}},"deny-create-default":{"identifier":"deny-create-default","description":"Denies the create_default command without any pre-configured scope.","commands":{"allow":[],"deny":["create_default"]}},"deny-get":{"identifier":"deny-get","description":"Denies the get command without any pre-configured scope.","commands":{"allow":[],"deny":["get"]}},"deny-insert":{"identifier":"deny-insert","description":"Denies the insert command without any pre-configured scope.","commands":{"allow":[],"deny":["insert"]}},"deny-is-checked":{"identifier":"deny-is-checked","description":"Denies the is_checked command without any pre-configured scope.","commands":{"allow":[],"deny":["is_checked"]}},"deny-is-enabled":{"identifier":"deny-is-enabled","description":"Denies the is_enabled command without any pre-configured scope.","commands":{"allow":[],"deny":["is_enabled"]}},"deny-items":{"identifier":"deny-items","description":"Denies the items command without any pre-configured scope.","commands":{"allow":[],"deny":["items"]}},"deny-new":{"identifier":"deny-new","description":"Denies the new command without any pre-configured scope.","commands":{"allow":[],"deny":["new"]}},"deny-popup":{"identifier":"deny-popup","description":"Denies the popup command without any pre-configured scope.","commands":{"allow":[],"deny":["popup"]}},"deny-prepend":{"identifier":"deny-prepend","description":"Denies the prepend command without any pre-configured scope.","commands":{"allow":[],"deny":["prepend"]}},"deny-remove":{"identifier":"deny-remove","description":"Denies the remove command without any pre-configured scope.","commands":{"allow":[],"deny":["remove"]}},"deny-remove-at":{"identifier":"deny-remove-at","description":"Denies the remove_at command without any pre-configured scope.","commands":{"allow":[],"deny":["remove_at"]}},"deny-set-accelerator":{"identifier":"deny-set-accelerator","description":"Denies the set_accelerator command without any pre-configured scope.","commands":{"allow":[],"deny":["set_accelerator"]}},"deny-set-as-app-menu":{"identifier":"deny-set-as-app-menu","description":"Denies the set_as_app_menu command without any pre-configured scope.","commands":{"allow":[],"deny":["set_as_app_menu"]}},"deny-set-as-help-menu-for-nsapp":{"identifier":"deny-set-as-help-menu-for-nsapp","description":"Denies the set_as_help_menu_for_nsapp command without any pre-configured scope.","commands":{"allow":[],"deny":["set_as_help_menu_for_nsapp"]}},"deny-set-as-window-menu":{"identifier":"deny-set-as-window-menu","description":"Denies the set_as_window_menu command without any pre-configured scope.","commands":{"allow":[],"deny":["set_as_window_menu"]}},"deny-set-as-windows-menu-for-nsapp":{"identifier":"deny-set-as-windows-menu-for-nsapp","description":"Denies the set_as_windows_menu_for_nsapp command without any pre-configured scope.","commands":{"allow":[],"deny":["set_as_windows_menu_for_nsapp"]}},"deny-set-checked":{"identifier":"deny-set-checked","description":"Denies the set_checked command without any pre-configured scope.","commands":{"allow":[],"deny":["set_checked"]}},"deny-set-enabled":{"identifier":"deny-set-enabled","description":"Denies the set_enabled command without any pre-configured scope.","commands":{"allow":[],"deny":["set_enabled"]}},"deny-set-icon":{"identifier":"deny-set-icon","description":"Denies the set_icon command without any pre-configured scope.","commands":{"allow":[],"deny":["set_icon"]}},"deny-set-text":{"identifier":"deny-set-text","description":"Denies the set_text command without any pre-configured scope.","commands":{"allow":[],"deny":["set_text"]}},"deny-text":{"identifier":"deny-text","description":"Denies the text command without any pre-configured scope.","commands":{"allow":[],"deny":["text"]}}},"permission_sets":{},"global_scope_schema":null},"core:path":{"default_permission":{"identifier":"default","description":"Default permissions for the plugin.","permissions":["allow-resolve-directory","allow-resolve","allow-normalize","allow-join","allow-dirname","allow-extname","allow-basename","allow-is-absolute"]},"permissions":{"allow-basename":{"identifier":"allow-basename","description":"Enables the basename command without any pre-configured scope.","commands":{"allow":["basename"],"deny":[]}},"allow-dirname":{"identifier":"allow-dirname","description":"Enables the dirname command without any pre-configured scope.","commands":{"allow":["dirname"],"deny":[]}},"allow-extname":{"identifier":"allow-extname","description":"Enables the extname command without any pre-configured scope.","commands":{"allow":["extname"],"deny":[]}},"allow-is-absolute":{"identifier":"allow-is-absolute","description":"Enables the is_absolute command without any pre-configured scope.","commands":{"allow":["is_absolute"],"deny":[]}},"allow-join":{"identifier":"allow-join","description":"Enables the join command without any pre-configured scope.","commands":{"allow":["join"],"deny":[]}},"allow-normalize":{"identifier":"allow-normalize","description":"Enables the normalize command without any pre-configured scope.","commands":{"allow":["normalize"],"deny":[]}},"allow-resolve":{"identifier":"allow-resolve","description":"Enables the resolve command without any pre-configured scope.","commands":{"allow":["resolve"],"deny":[]}},"allow-resolve-directory":{"identifier":"allow-resolve-directory","description":"Enables the resolve_directory command without any pre-configured scope.","commands":{"allow":["resolve_directory"],"deny":[]}},"deny-basename":{"identifier":"deny-basename","description":"Denies the basename command without any pre-configured scope.","commands":{"allow":[],"deny":["basename"]}},"deny-dirname":{"identifier":"deny-dirname","description":"Denies the dirname command without any pre-configured scope.","commands":{"allow":[],"deny":["dirname"]}},"deny-extname":{"identifier":"deny-extname","description":"Denies the extname command without any pre-configured scope.","commands":{"allow":[],"deny":["extname"]}},"deny-is-absolute":{"identifier":"deny-is-absolute","description":"Denies the is_absolute command without any pre-configured scope.","commands":{"allow":[],"deny":["is_absolute"]}},"deny-join":{"identifier":"deny-join","description":"Denies the join command without any pre-configured scope.","commands":{"allow":[],"deny":["join"]}},"deny-normalize":{"identifier":"deny-normalize","description":"Denies the normalize command without any pre-configured scope.","commands":{"allow":[],"deny":["normalize"]}},"deny-resolve":{"identifier":"deny-resolve","description":"Denies the resolve command without any pre-configured scope.","commands":{"allow":[],"deny":["resolve"]}},"deny-resolve-directory":{"identifier":"deny-resolve-directory","description":"Denies the resolve_directory command without any pre-configured scope.","commands":{"allow":[],"deny":["resolve_directory"]}}},"permission_sets":{},"global_scope_schema":null},"core:resources":{"default_permission":{"identifier":"default","description":"Default permissions for the plugin.","permissions":["allow-close"]},"permissions":{"allow-close":{"identifier":"allow-close","description":"Enables the close command without any pre-configured scope.","commands":{"allow":["close"],"deny":[]}},"deny-close":{"identifier":"deny-close","description":"Denies the close command without any pre-configured scope.","commands":{"allow":[],"deny":["close"]}}},"permission_sets":{},"global_scope_schema":null},"core:tray":{"default_permission":{"identifier":"default","description":"Default permissions for the plugin.","permissions":["allow-new","allow-get-by-id","allow-remove-by-id","allow-set-icon","allow-set-menu","allow-set-tooltip","allow-set-title","allow-set-visible","allow-set-temp-dir-path","allow-set-icon-as-template","allow-set-show-menu-on-left-click"]},"permissions":{"allow-get-by-id":{"identifier":"allow-get-by-id","description":"Enables the get_by_id command without any pre-configured scope.","commands":{"allow":["get_by_id"],"deny":[]}},"allow-new":{"identifier":"allow-new","description":"Enables the new command without any pre-configured scope.","commands":{"allow":["new"],"deny":[]}},"allow-remove-by-id":{"identifier":"allow-remove-by-id","description":"Enables the remove_by_id command without any pre-configured scope.","commands":{"allow":["remove_by_id"],"deny":[]}},"allow-set-icon":{"identifier":"allow-set-icon","description":"Enables the set_icon command without any pre-configured scope.","commands":{"allow":["set_icon"],"deny":[]}},"allow-set-icon-as-template":{"identifier":"allow-set-icon-as-template","description":"Enables the set_icon_as_template command without any pre-configured scope.","commands":{"allow":["set_icon_as_template"],"deny":[]}},"allow-set-menu":{"identifier":"allow-set-menu","description":"Enables the set_menu command without any pre-configured scope.","commands":{"allow":["set_menu"],"deny":[]}},"allow-set-show-menu-on-left-click":{"identifier":"allow-set-show-menu-on-left-click","description":"Enables the set_show_menu_on_left_click command without any pre-configured scope.","commands":{"allow":["set_show_menu_on_left_click"],"deny":[]}},"allow-set-temp-dir-path":{"identifier":"allow-set-temp-dir-path","description":"Enables the set_temp_dir_path command without any pre-configured scope.","commands":{"allow":["set_temp_dir_path"],"deny":[]}},"allow-set-title":{"identifier":"allow-set-title","description":"Enables the set_title command without any pre-configured scope.","commands":{"allow":["set_title"],"deny":[]}},"allow-set-tooltip":{"identifier":"allow-set-tooltip","description":"Enables the set_tooltip command without any pre-configured scope.","commands":{"allow":["set_tooltip"],"deny":[]}},"allow-set-visible":{"identifier":"allow-set-visible","description":"Enables the set_visible command without any pre-configured scope.","commands":{"allow":["set_visible"],"deny":[]}},"deny-get-by-id":{"identifier":"deny-get-by-id","description":"Denies the get_by_id command without any pre-configured scope.","commands":{"allow":[],"deny":["get_by_id"]}},"deny-new":{"identifier":"deny-new","description":"Denies the new command without any pre-configured scope.","commands":{"allow":[],"deny":["new"]}},"deny-remove-by-id":{"identifier":"deny-remove-by-id","description":"Denies the remove_by_id command without any pre-configured scope.","commands":{"allow":[],"deny":["remove_by_id"]}},"deny-set-icon":{"identifier":"deny-set-icon","description":"Denies the set_icon command without any pre-configured scope.","commands":{"allow":[],"deny":["set_icon"]}},"deny-set-icon-as-template":{"identifier":"deny-set-icon-as-template","description":"Denies the set_icon_as_template command without any pre-configured scope.","commands":{"allow":[],"deny":["set_icon_as_template"]}},"deny-set-menu":{"identifier":"deny-set-menu","description":"Denies the set_menu command without any pre-configured scope.","commands":{"allow":[],"deny":["set_menu"]}},"deny-set-show-menu-on-left-click":{"identifier":"deny-set-show-menu-on-left-click","description":"Denies the set_show_menu_on_left_click command without any pre-configured scope.","commands":{"allow":[],"deny":["set_show_menu_on_left_click"]}},"deny-set-temp-dir-path":{"identifier":"deny-set-temp-dir-path","description":"Denies the set_temp_dir_path command without any pre-configured scope.","commands":{"allow":[],"deny":["set_temp_dir_path"]}},"deny-set-title":{"identifier":"deny-set-title","description":"Denies the set_title command without any pre-configured scope.","commands":{"allow":[],"deny":["set_title"]}},"deny-set-tooltip":{"identifier":"deny-set-tooltip","description":"Denies the set_tooltip command without any pre-configured scope.","commands":{"allow":[],"deny":["set_tooltip"]}},"deny-set-visible":{"identifier":"deny-set-visible","description":"Denies the set_visible command without any pre-configured scope.","commands":{"allow":[],"deny":["set_visible"]}}},"permission_sets":{},"global_scope_schema":null},"core:webview":{"default_permission":{"identifier":"default","description":"Default permissions for the plugin.","permissions":["allow-get-all-webviews","allow-webview-position","allow-webview-size","allow-internal-toggle-devtools"]},"permissions":{"allow-create-webview":{"identifier":"allow-create-webview","description":"Enables the create_webview command without any pre-configured scope.","commands":{"allow":["create_webview"],"deny":[]}},"allow-create-webview-window":{"identifier":"allow-create-webview-window","description":"Enables the create_webview_window command without any pre-configured scope.","commands":{"allow":["create_webview_window"],"deny":[]}},"allow-get-all-webviews":{"identifier":"allow-get-all-webviews","description":"Enables the get_all_webviews command without any pre-configured scope.","commands":{"allow":["get_all_webviews"],"deny":[]}},"allow-internal-toggle-devtools":{"identifier":"allow-internal-toggle-devtools","description":"Enables the internal_toggle_devtools command without any pre-configured scope.","commands":{"allow":["internal_toggle_devtools"],"deny":[]}},"allow-print":{"identifier":"allow-print","description":"Enables the print command without any pre-configured scope.","commands":{"allow":["print"],"deny":[]}},"allow-reparent":{"identifier":"allow-reparent","description":"Enables the reparent command without any pre-configured scope.","commands":{"allow":["reparent"],"deny":[]}},"allow-set-webview-focus":{"identifier":"allow-set-webview-focus","description":"Enables the set_webview_focus command without any pre-configured scope.","commands":{"allow":["set_webview_focus"],"deny":[]}},"allow-set-webview-position":{"identifier":"allow-set-webview-position","description":"Enables the set_webview_position command without any pre-configured scope.","commands":{"allow":["set_webview_position"],"deny":[]}},"allow-set-webview-size":{"identifier":"allow-set-webview-size","description":"Enables the set_webview_size command without any pre-configured scope.","commands":{"allow":["set_webview_size"],"deny":[]}},"allow-set-webview-zoom":{"identifier":"allow-set-webview-zoom","description":"Enables the set_webview_zoom command without any pre-configured scope.","commands":{"allow":["set_webview_zoom"],"deny":[]}},"allow-webview-close":{"identifier":"allow-webview-close","description":"Enables the webview_close command without any pre-configured scope.","commands":{"allow":["webview_close"],"deny":[]}},"allow-webview-position":{"identifier":"allow-webview-position","description":"Enables the webview_position command without any pre-configured scope.","commands":{"allow":["webview_position"],"deny":[]}},"allow-webview-size":{"identifier":"allow-webview-size","description":"Enables the webview_size command without any pre-configured scope.","commands":{"allow":["webview_size"],"deny":[]}},"deny-create-webview":{"identifier":"deny-create-webview","description":"Denies the create_webview command without any pre-configured scope.","commands":{"allow":[],"deny":["create_webview"]}},"deny-create-webview-window":{"identifier":"deny-create-webview-window","description":"Denies the create_webview_window command without any pre-configured scope.","commands":{"allow":[],"deny":["create_webview_window"]}},"deny-get-all-webviews":{"identifier":"deny-get-all-webviews","description":"Denies the get_all_webviews command without any pre-configured scope.","commands":{"allow":[],"deny":["get_all_webviews"]}},"deny-internal-toggle-devtools":{"identifier":"deny-internal-toggle-devtools","description":"Denies the internal_toggle_devtools command without any pre-configured scope.","commands":{"allow":[],"deny":["internal_toggle_devtools"]}},"deny-print":{"identifier":"deny-print","description":"Denies the print command without any pre-configured scope.","commands":{"allow":[],"deny":["print"]}},"deny-reparent":{"identifier":"deny-reparent","description":"Denies the reparent command without any pre-configured scope.","commands":{"allow":[],"deny":["reparent"]}},"deny-set-webview-focus":{"identifier":"deny-set-webview-focus","description":"Denies the set_webview_focus command without any pre-configured scope.","commands":{"allow":[],"deny":["set_webview_focus"]}},"deny-set-webview-position":{"identifier":"deny-set-webview-position","description":"Denies the set_webview_position command without any pre-configured scope.","commands":{"allow":[],"deny":["set_webview_position"]}},"deny-set-webview-size":{"identifier":"deny-set-webview-size","description":"Denies the set_webview_size command without any pre-configured scope.","commands":{"allow":[],"deny":["set_webview_size"]}},"deny-set-webview-zoom":{"identifier":"deny-set-webview-zoom","description":"Denies the set_webview_zoom command without any pre-configured scope.","commands":{"allow":[],"deny":["set_webview_zoom"]}},"deny-webview-close":{"identifier":"deny-webview-close","description":"Denies the webview_close command without any pre-configured scope.","commands":{"allow":[],"deny":["webview_close"]}},"deny-webview-position":{"identifier":"deny-webview-position","description":"Denies the webview_position command without any pre-configured scope.","commands":{"allow":[],"deny":["webview_position"]}},"deny-webview-size":{"identifier":"deny-webview-size","description":"Denies the webview_size command without any pre-configured scope.","commands":{"allow":[],"deny":["webview_size"]}}},"permission_sets":{},"global_scope_schema":null},"core:window":{"default_permission":{"identifier":"default","description":"Default permissions for the plugin.","permissions":["allow-get-all-windows","allow-scale-factor","allow-inner-position","allow-outer-position","allow-inner-size","allow-outer-size","allow-is-fullscreen","allow-is-minimized","allow-is-maximized","allow-is-focused","allow-is-decorated","allow-is-resizable","allow-is-maximizable","allow-is-minimizable","allow-is-closable","allow-is-visible","allow-title","allow-current-monitor","allow-primary-monitor","allow-monitor-from-point","allow-available-monitors","allow-cursor-position","allow-theme","allow-internal-toggle-maximize"]},"permissions":{"allow-available-monitors":{"identifier":"allow-available-monitors","description":"Enables the available_monitors command without any pre-configured scope.","commands":{"allow":["available_monitors"],"deny":[]}},"allow-center":{"identifier":"allow-center","description":"Enables the center command without any pre-configured scope.","commands":{"allow":["center"],"deny":[]}},"allow-close":{"identifier":"allow-close","description":"Enables the close command without any pre-configured scope.","commands":{"allow":["close"],"deny":[]}},"allow-create":{"identifier":"allow-create","description":"Enables the create command without any pre-configured scope.","commands":{"allow":["create"],"deny":[]}},"allow-current-monitor":{"identifier":"allow-current-monitor","description":"Enables the current_monitor command without any pre-configured scope.","commands":{"allow":["current_monitor"],"deny":[]}},"allow-cursor-position":{"identifier":"allow-cursor-position","description":"Enables the cursor_position command without any pre-configured scope.","commands":{"allow":["cursor_position"],"deny":[]}},"allow-destroy":{"identifier":"allow-destroy","description":"Enables the destroy command without any pre-configured scope.","commands":{"allow":["destroy"],"deny":[]}},"allow-get-all-windows":{"identifier":"allow-get-all-windows","description":"Enables the get_all_windows command without any pre-configured scope.","commands":{"allow":["get_all_windows"],"deny":[]}},"allow-hide":{"identifier":"allow-hide","description":"Enables the hide command without any pre-configured scope.","commands":{"allow":["hide"],"deny":[]}},"allow-inner-position":{"identifier":"allow-inner-position","description":"Enables the inner_position command without any pre-configured scope.","commands":{"allow":["inner_position"],"deny":[]}},"allow-inner-size":{"identifier":"allow-inner-size","description":"Enables the inner_size command without any pre-configured scope.","commands":{"allow":["inner_size"],"deny":[]}},"allow-internal-toggle-maximize":{"identifier":"allow-internal-toggle-maximize","description":"Enables the internal_toggle_maximize command without any pre-configured scope.","commands":{"allow":["internal_toggle_maximize"],"deny":[]}},"allow-is-closable":{"identifier":"allow-is-closable","description":"Enables the is_closable command without any pre-configured scope.","commands":{"allow":["is_closable"],"deny":[]}},"allow-is-decorated":{"identifier":"allow-is-decorated","description":"Enables the is_decorated command without any pre-configured scope.","commands":{"allow":["is_decorated"],"deny":[]}},"allow-is-focused":{"identifier":"allow-is-focused","description":"Enables the is_focused command without any pre-configured scope.","commands":{"allow":["is_focused"],"deny":[]}},"allow-is-fullscreen":{"identifier":"allow-is-fullscreen","description":"Enables the is_fullscreen command without any pre-configured scope.","commands":{"allow":["is_fullscreen"],"deny":[]}},"allow-is-maximizable":{"identifier":"allow-is-maximizable","description":"Enables the is_maximizable command without any pre-configured scope.","commands":{"allow":["is_maximizable"],"deny":[]}},"allow-is-maximized":{"identifier":"allow-is-maximized","description":"Enables the is_maximized command without any pre-configured scope.","commands":{"allow":["is_maximized"],"deny":[]}},"allow-is-minimizable":{"identifier":"allow-is-minimizable","description":"Enables the is_minimizable command without any pre-configured scope.","commands":{"allow":["is_minimizable"],"deny":[]}},"allow-is-minimized":{"identifier":"allow-is-minimized","description":"Enables the is_minimized command without any pre-configured scope.","commands":{"allow":["is_minimized"],"deny":[]}},"allow-is-resizable":{"identifier":"allow-is-resizable","description":"Enables the is_resizable command without any pre-configured scope.","commands":{"allow":["is_resizable"],"deny":[]}},"allow-is-visible":{"identifier":"allow-is-visible","description":"Enables the is_visible command without any pre-configured scope.","commands":{"allow":["is_visible"],"deny":[]}},"allow-maximize":{"identifier":"allow-maximize","description":"Enables the maximize command without any pre-configured scope.","commands":{"allow":["maximize"],"deny":[]}},"allow-minimize":{"identifier":"allow-minimize","description":"Enables the minimize command without any pre-configured scope.","commands":{"allow":["minimize"],"deny":[]}},"allow-monitor-from-point":{"identifier":"allow-monitor-from-point","description":"Enables the monitor_from_point command without any pre-configured scope.","commands":{"allow":["monitor_from_point"],"deny":[]}},"allow-outer-position":{"identifier":"allow-outer-position","description":"Enables the outer_position command without any pre-configured scope.","commands":{"allow":["outer_position"],"deny":[]}},"allow-outer-size":{"identifier":"allow-outer-size","description":"Enables the outer_size command without any pre-configured scope.","commands":{"allow":["outer_size"],"deny":[]}},"allow-primary-monitor":{"identifier":"allow-primary-monitor","description":"Enables the primary_monitor command without any pre-configured scope.","commands":{"allow":["primary_monitor"],"deny":[]}},"allow-request-user-attention":{"identifier":"allow-request-user-attention","description":"Enables the request_user_attention command without any pre-configured scope.","commands":{"allow":["request_user_attention"],"deny":[]}},"allow-scale-factor":{"identifier":"allow-scale-factor","description":"Enables the scale_factor command without any pre-configured scope.","commands":{"allow":["scale_factor"],"deny":[]}},"allow-set-always-on-bottom":{"identifier":"allow-set-always-on-bottom","description":"Enables the set_always_on_bottom command without any pre-configured scope.","commands":{"allow":["set_always_on_bottom"],"deny":[]}},"allow-set-always-on-top":{"identifier":"allow-set-always-on-top","description":"Enables the set_always_on_top command without any pre-configured scope.","commands":{"allow":["set_always_on_top"],"deny":[]}},"allow-set-closable":{"identifier":"allow-set-closable","description":"Enables the set_closable command without any pre-configured scope.","commands":{"allow":["set_closable"],"deny":[]}},"allow-set-content-protected":{"identifier":"allow-set-content-protected","description":"Enables the set_content_protected command without any pre-configured scope.","commands":{"allow":["set_content_protected"],"deny":[]}},"allow-set-cursor-grab":{"identifier":"allow-set-cursor-grab","description":"Enables the set_cursor_grab command without any pre-configured scope.","commands":{"allow":["set_cursor_grab"],"deny":[]}},"allow-set-cursor-icon":{"identifier":"allow-set-cursor-icon","description":"Enables the set_cursor_icon command without any pre-configured scope.","commands":{"allow":["set_cursor_icon"],"deny":[]}},"allow-set-cursor-position":{"identifier":"allow-set-cursor-position","description":"Enables the set_cursor_position command without any pre-configured scope.","commands":{"allow":["set_cursor_position"],"deny":[]}},"allow-set-cursor-visible":{"identifier":"allow-set-cursor-visible","description":"Enables the set_cursor_visible command without any pre-configured scope.","commands":{"allow":["set_cursor_visible"],"deny":[]}},"allow-set-decorations":{"identifier":"allow-set-decorations","description":"Enables the set_decorations command without any pre-configured scope.","commands":{"allow":["set_decorations"],"deny":[]}},"allow-set-effects":{"identifier":"allow-set-effects","description":"Enables the set_effects command without any pre-configured scope.","commands":{"allow":["set_effects"],"deny":[]}},"allow-set-focus":{"identifier":"allow-set-focus","description":"Enables the set_focus command without any pre-configured scope.","commands":{"allow":["set_focus"],"deny":[]}},"allow-set-fullscreen":{"identifier":"allow-set-fullscreen","description":"Enables the set_fullscreen command without any pre-configured scope.","commands":{"allow":["set_fullscreen"],"deny":[]}},"allow-set-icon":{"identifier":"allow-set-icon","description":"Enables the set_icon command without any pre-configured scope.","commands":{"allow":["set_icon"],"deny":[]}},"allow-set-ignore-cursor-events":{"identifier":"allow-set-ignore-cursor-events","description":"Enables the set_ignore_cursor_events command without any pre-configured scope.","commands":{"allow":["set_ignore_cursor_events"],"deny":[]}},"allow-set-max-size":{"identifier":"allow-set-max-size","description":"Enables the set_max_size command without any pre-configured scope.","commands":{"allow":["set_max_size"],"deny":[]}},"allow-set-maximizable":{"identifier":"allow-set-maximizable","description":"Enables the set_maximizable command without any pre-configured scope.","commands":{"allow":["set_maximizable"],"deny":[]}},"allow-set-min-size":{"identifier":"allow-set-min-size","description":"Enables the set_min_size command without any pre-configured scope.","commands":{"allow":["set_min_size"],"deny":[]}},"allow-set-minimizable":{"identifier":"allow-set-minimizable","description":"Enables the set_minimizable command without any pre-configured scope.","commands":{"allow":["set_minimizable"],"deny":[]}},"allow-set-position":{"identifier":"allow-set-position","description":"Enables the set_position command without any pre-configured scope.","commands":{"allow":["set_position"],"deny":[]}},"allow-set-progress-bar":{"identifier":"allow-set-progress-bar","description":"Enables the set_progress_bar command without any pre-configured scope.","commands":{"allow":["set_progress_bar"],"deny":[]}},"allow-set-resizable":{"identifier":"allow-set-resizable","description":"Enables the set_resizable command without any pre-configured scope.","commands":{"allow":["set_resizable"],"deny":[]}},"allow-set-shadow":{"identifier":"allow-set-shadow","description":"Enables the set_shadow command without any pre-configured scope.","commands":{"allow":["set_shadow"],"deny":[]}},"allow-set-size":{"identifier":"allow-set-size","description":"Enables the set_size command without any pre-configured scope.","commands":{"allow":["set_size"],"deny":[]}},"allow-set-size-constraints":{"identifier":"allow-set-size-constraints","description":"Enables the set_size_constraints command without any pre-configured scope.","commands":{"allow":["set_size_constraints"],"deny":[]}},"allow-set-skip-taskbar":{"identifier":"allow-set-skip-taskbar","description":"Enables the set_skip_taskbar command without any pre-configured scope.","commands":{"allow":["set_skip_taskbar"],"deny":[]}},"allow-set-title":{"identifier":"allow-set-title","description":"Enables the set_title command without any pre-configured scope.","commands":{"allow":["set_title"],"deny":[]}},"allow-set-title-bar-style":{"identifier":"allow-set-title-bar-style","description":"Enables the set_title_bar_style command without any pre-configured scope.","commands":{"allow":["set_title_bar_style"],"deny":[]}},"allow-set-visible-on-all-workspaces":{"identifier":"allow-set-visible-on-all-workspaces","description":"Enables the set_visible_on_all_workspaces command without any pre-configured scope.","commands":{"allow":["set_visible_on_all_workspaces"],"deny":[]}},"allow-show":{"identifier":"allow-show","description":"Enables the show command without any pre-configured scope.","commands":{"allow":["show"],"deny":[]}},"allow-start-dragging":{"identifier":"allow-start-dragging","description":"Enables the start_dragging command without any pre-configured scope.","commands":{"allow":["start_dragging"],"deny":[]}},"allow-start-resize-dragging":{"identifier":"allow-start-resize-dragging","description":"Enables the start_resize_dragging command without any pre-configured scope.","commands":{"allow":["start_resize_dragging"],"deny":[]}},"allow-theme":{"identifier":"allow-theme","description":"Enables the theme command without any pre-configured scope.","commands":{"allow":["theme"],"deny":[]}},"allow-title":{"identifier":"allow-title","description":"Enables the title command without any pre-configured scope.","commands":{"allow":["title"],"deny":[]}},"allow-toggle-maximize":{"identifier":"allow-toggle-maximize","description":"Enables the toggle_maximize command without any pre-configured scope.","commands":{"allow":["toggle_maximize"],"deny":[]}},"allow-unmaximize":{"identifier":"allow-unmaximize","description":"Enables the unmaximize command without any pre-configured scope.","commands":{"allow":["unmaximize"],"deny":[]}},"allow-unminimize":{"identifier":"allow-unminimize","description":"Enables the unminimize command without any pre-configured scope.","commands":{"allow":["unminimize"],"deny":[]}},"deny-available-monitors":{"identifier":"deny-available-monitors","description":"Denies the available_monitors command without any pre-configured scope.","commands":{"allow":[],"deny":["available_monitors"]}},"deny-center":{"identifier":"deny-center","description":"Denies the center command without any pre-configured scope.","commands":{"allow":[],"deny":["center"]}},"deny-close":{"identifier":"deny-close","description":"Denies the close command without any pre-configured scope.","commands":{"allow":[],"deny":["close"]}},"deny-create":{"identifier":"deny-create","description":"Denies the create command without any pre-configured scope.","commands":{"allow":[],"deny":["create"]}},"deny-current-monitor":{"identifier":"deny-current-monitor","description":"Denies the current_monitor command without any pre-configured scope.","commands":{"allow":[],"deny":["current_monitor"]}},"deny-cursor-position":{"identifier":"deny-cursor-position","description":"Denies the cursor_position command without any pre-configured scope.","commands":{"allow":[],"deny":["cursor_position"]}},"deny-destroy":{"identifier":"deny-destroy","description":"Denies the destroy command without any pre-configured scope.","commands":{"allow":[],"deny":["destroy"]}},"deny-get-all-windows":{"identifier":"deny-get-all-windows","description":"Denies the get_all_windows command without any pre-configured scope.","commands":{"allow":[],"deny":["get_all_windows"]}},"deny-hide":{"identifier":"deny-hide","description":"Denies the hide command without any pre-configured scope.","commands":{"allow":[],"deny":["hide"]}},"deny-inner-position":{"identifier":"deny-inner-position","description":"Denies the inner_position command without any pre-configured scope.","commands":{"allow":[],"deny":["inner_position"]}},"deny-inner-size":{"identifier":"deny-inner-size","description":"Denies the inner_size command without any pre-configured scope.","commands":{"allow":[],"deny":["inner_size"]}},"deny-internal-toggle-maximize":{"identifier":"deny-internal-toggle-maximize","description":"Denies the internal_toggle_maximize command without any pre-configured scope.","commands":{"allow":[],"deny":["internal_toggle_maximize"]}},"deny-is-closable":{"identifier":"deny-is-closable","description":"Denies the is_closable command without any pre-configured scope.","commands":{"allow":[],"deny":["is_closable"]}},"deny-is-decorated":{"identifier":"deny-is-decorated","description":"Denies the is_decorated command without any pre-configured scope.","commands":{"allow":[],"deny":["is_decorated"]}},"deny-is-focused":{"identifier":"deny-is-focused","description":"Denies the is_focused command without any pre-configured scope.","commands":{"allow":[],"deny":["is_focused"]}},"deny-is-fullscreen":{"identifier":"deny-is-fullscreen","description":"Denies the is_fullscreen command without any pre-configured scope.","commands":{"allow":[],"deny":["is_fullscreen"]}},"deny-is-maximizable":{"identifier":"deny-is-maximizable","description":"Denies the is_maximizable command without any pre-configured scope.","commands":{"allow":[],"deny":["is_maximizable"]}},"deny-is-maximized":{"identifier":"deny-is-maximized","description":"Denies the is_maximized command without any pre-configured scope.","commands":{"allow":[],"deny":["is_maximized"]}},"deny-is-minimizable":{"identifier":"deny-is-minimizable","description":"Denies the is_minimizable command without any pre-configured scope.","commands":{"allow":[],"deny":["is_minimizable"]}},"deny-is-minimized":{"identifier":"deny-is-minimized","description":"Denies the is_minimized command without any pre-configured scope.","commands":{"allow":[],"deny":["is_minimized"]}},"deny-is-resizable":{"identifier":"deny-is-resizable","description":"Denies the is_resizable command without any pre-configured scope.","commands":{"allow":[],"deny":["is_resizable"]}},"deny-is-visible":{"identifier":"deny-is-visible","description":"Denies the is_visible command without any pre-configured scope.","commands":{"allow":[],"deny":["is_visible"]}},"deny-maximize":{"identifier":"deny-maximize","description":"Denies the maximize command without any pre-configured scope.","commands":{"allow":[],"deny":["maximize"]}},"deny-minimize":{"identifier":"deny-minimize","description":"Denies the minimize command without any pre-configured scope.","commands":{"allow":[],"deny":["minimize"]}},"deny-monitor-from-point":{"identifier":"deny-monitor-from-point","description":"Denies the monitor_from_point command without any pre-configured scope.","commands":{"allow":[],"deny":["monitor_from_point"]}},"deny-outer-position":{"identifier":"deny-outer-position","description":"Denies the outer_position command without any pre-configured scope.","commands":{"allow":[],"deny":["outer_position"]}},"deny-outer-size":{"identifier":"deny-outer-size","description":"Denies the outer_size command without any pre-configured scope.","commands":{"allow":[],"deny":["outer_size"]}},"deny-primary-monitor":{"identifier":"deny-primary-monitor","description":"Denies the primary_monitor command without any pre-configured scope.","commands":{"allow":[],"deny":["primary_monitor"]}},"deny-request-user-attention":{"identifier":"deny-request-user-attention","description":"Denies the request_user_attention command without any pre-configured scope.","commands":{"allow":[],"deny":["request_user_attention"]}},"deny-scale-factor":{"identifier":"deny-scale-factor","description":"Denies the scale_factor command without any pre-configured scope.","commands":{"allow":[],"deny":["scale_factor"]}},"deny-set-always-on-bottom":{"identifier":"deny-set-always-on-bottom","description":"Denies the set_always_on_bottom command without any pre-configured scope.","commands":{"allow":[],"deny":["set_always_on_bottom"]}},"deny-set-always-on-top":{"identifier":"deny-set-always-on-top","description":"Denies the set_always_on_top command without any pre-configured scope.","commands":{"allow":[],"deny":["set_always_on_top"]}},"deny-set-closable":{"identifier":"deny-set-closable","description":"Denies the set_closable command without any pre-configured scope.","commands":{"allow":[],"deny":["set_closable"]}},"deny-set-content-protected":{"identifier":"deny-set-content-protected","description":"Denies the set_content_protected command without any pre-configured scope.","commands":{"allow":[],"deny":["set_content_protected"]}},"deny-set-cursor-grab":{"identifier":"deny-set-cursor-grab","description":"Denies the set_cursor_grab command without any pre-configured scope.","commands":{"allow":[],"deny":["set_cursor_grab"]}},"deny-set-cursor-icon":{"identifier":"deny-set-cursor-icon","description":"Denies the set_cursor_icon command without any pre-configured scope.","commands":{"allow":[],"deny":["set_cursor_icon"]}},"deny-set-cursor-position":{"identifier":"deny-set-cursor-position","description":"Denies the set_cursor_position command without any pre-configured scope.","commands":{"allow":[],"deny":["set_cursor_position"]}},"deny-set-cursor-visible":{"identifier":"deny-set-cursor-visible","description":"Denies the set_cursor_visible command without any pre-configured scope.","commands":{"allow":[],"deny":["set_cursor_visible"]}},"deny-set-decorations":{"identifier":"deny-set-decorations","description":"Denies the set_decorations command without any pre-configured scope.","commands":{"allow":[],"deny":["set_decorations"]}},"deny-set-effects":{"identifier":"deny-set-effects","description":"Denies the set_effects command without any pre-configured scope.","commands":{"allow":[],"deny":["set_effects"]}},"deny-set-focus":{"identifier":"deny-set-focus","description":"Denies the set_focus command without any pre-configured scope.","commands":{"allow":[],"deny":["set_focus"]}},"deny-set-fullscreen":{"identifier":"deny-set-fullscreen","description":"Denies the set_fullscreen command without any pre-configured scope.","commands":{"allow":[],"deny":["set_fullscreen"]}},"deny-set-icon":{"identifier":"deny-set-icon","description":"Denies the set_icon command without any pre-configured scope.","commands":{"allow":[],"deny":["set_icon"]}},"deny-set-ignore-cursor-events":{"identifier":"deny-set-ignore-cursor-events","description":"Denies the set_ignore_cursor_events command without any pre-configured scope.","commands":{"allow":[],"deny":["set_ignore_cursor_events"]}},"deny-set-max-size":{"identifier":"deny-set-max-size","description":"Denies the set_max_size command without any pre-configured scope.","commands":{"allow":[],"deny":["set_max_size"]}},"deny-set-maximizable":{"identifier":"deny-set-maximizable","description":"Denies the set_maximizable command without any pre-configured scope.","commands":{"allow":[],"deny":["set_maximizable"]}},"deny-set-min-size":{"identifier":"deny-set-min-size","description":"Denies the set_min_size command without any pre-configured scope.","commands":{"allow":[],"deny":["set_min_size"]}},"deny-set-minimizable":{"identifier":"deny-set-minimizable","description":"Denies the set_minimizable command without any pre-configured scope.","commands":{"allow":[],"deny":["set_minimizable"]}},"deny-set-position":{"identifier":"deny-set-position","description":"Denies the set_position command without any pre-configured scope.","commands":{"allow":[],"deny":["set_position"]}},"deny-set-progress-bar":{"identifier":"deny-set-progress-bar","description":"Denies the set_progress_bar command without any pre-configured scope.","commands":{"allow":[],"deny":["set_progress_bar"]}},"deny-set-resizable":{"identifier":"deny-set-resizable","description":"Denies the set_resizable command without any pre-configured scope.","commands":{"allow":[],"deny":["set_resizable"]}},"deny-set-shadow":{"identifier":"deny-set-shadow","description":"Denies the set_shadow command without any pre-configured scope.","commands":{"allow":[],"deny":["set_shadow"]}},"deny-set-size":{"identifier":"deny-set-size","description":"Denies the set_size command without any pre-configured scope.","commands":{"allow":[],"deny":["set_size"]}},"deny-set-size-constraints":{"identifier":"deny-set-size-constraints","description":"Denies the set_size_constraints command without any pre-configured scope.","commands":{"allow":[],"deny":["set_size_constraints"]}},"deny-set-skip-taskbar":{"identifier":"deny-set-skip-taskbar","description":"Denies the set_skip_taskbar command without any pre-configured scope.","commands":{"allow":[],"deny":["set_skip_taskbar"]}},"deny-set-title":{"identifier":"deny-set-title","description":"Denies the set_title command without any pre-configured scope.","commands":{"allow":[],"deny":["set_title"]}},"deny-set-title-bar-style":{"identifier":"deny-set-title-bar-style","description":"Denies the set_title_bar_style command without any pre-configured scope.","commands":{"allow":[],"deny":["set_title_bar_style"]}},"deny-set-visible-on-all-workspaces":{"identifier":"deny-set-visible-on-all-workspaces","description":"Denies the set_visible_on_all_workspaces command without any pre-configured scope.","commands":{"allow":[],"deny":["set_visible_on_all_workspaces"]}},"deny-show":{"identifier":"deny-show","description":"Denies the show command without any pre-configured scope.","commands":{"allow":[],"deny":["show"]}},"deny-start-dragging":{"identifier":"deny-start-dragging","description":"Denies the start_dragging command without any pre-configured scope.","commands":{"allow":[],"deny":["start_dragging"]}},"deny-start-resize-dragging":{"identifier":"deny-start-resize-dragging","description":"Denies the start_resize_dragging command without any pre-configured scope.","commands":{"allow":[],"deny":["start_resize_dragging"]}},"deny-theme":{"identifier":"deny-theme","description":"Denies the theme command without any pre-configured scope.","commands":{"allow":[],"deny":["theme"]}},"deny-title":{"identifier":"deny-title","description":"Denies the title command without any pre-configured scope.","commands":{"allow":[],"deny":["title"]}},"deny-toggle-maximize":{"identifier":"deny-toggle-maximize","description":"Denies the toggle_maximize command without any pre-configured scope.","commands":{"allow":[],"deny":["toggle_maximize"]}},"deny-unmaximize":{"identifier":"deny-unmaximize","description":"Denies the unmaximize command without any pre-configured scope.","commands":{"allow":[],"deny":["unmaximize"]}},"deny-unminimize":{"identifier":"deny-unminimize","description":"Denies the unminimize command without any pre-configured scope.","commands":{"allow":[],"deny":["unminimize"]}}},"permission_sets":{},"global_scope_schema":null},"dialog":{"default_permission":{"identifier":"default","description":"This permission set configures the types of dialogs\navailable from the dialog plugin.\n\n#### Granted Permissions\n\nAll dialog types are enabled.\n\n\n","permissions":["allow-ask","allow-confirm","allow-message","allow-save","allow-open"]},"permissions":{"allow-ask":{"identifier":"allow-ask","description":"Enables the ask command without any pre-configured scope.","commands":{"allow":["ask"],"deny":[]}},"allow-confirm":{"identifier":"allow-confirm","description":"Enables the confirm command without any pre-configured scope.","commands":{"allow":["confirm"],"deny":[]}},"allow-message":{"identifier":"allow-message","description":"Enables the message command without any pre-configured scope.","commands":{"allow":["message"],"deny":[]}},"allow-open":{"identifier":"allow-open","description":"Enables the open command without any pre-configured scope.","commands":{"allow":["open"],"deny":[]}},"allow-save":{"identifier":"allow-save","description":"Enables the save command without any pre-configured scope.","commands":{"allow":["save"],"deny":[]}},"deny-ask":{"identifier":"deny-ask","description":"Denies the ask command without any pre-configured scope.","commands":{"allow":[],"deny":["ask"]}},"deny-confirm":{"identifier":"deny-confirm","description":"Denies the confirm command without any pre-configured scope.","commands":{"allow":[],"deny":["confirm"]}},"deny-message":{"identifier":"deny-message","description":"Denies the message command without any pre-configured scope.","commands":{"allow":[],"deny":["message"]}},"deny-open":{"identifier":"deny-open","description":"Denies the open command without any pre-configured scope.","commands":{"allow":[],"deny":["open"]}},"deny-save":{"identifier":"deny-save","description":"Denies the save command without any pre-configured scope.","commands":{"allow":[],"deny":["save"]}}},"permission_sets":{},"global_scope_schema":null},"fs":{"default_permission":{"identifier":"default","description":"This set of permissions describes the what kind of\nfile system access the `fs` plugin has enabled or denied by default.\n\n#### Granted Permissions\n\nThis default permission set enables read access to the\napplication specific directories (AppConfig, AppData, AppLocalData, AppCache,\nAppLog) and all files and sub directories created in it.\nThe location of these directories depends on the operating system,\nwhere the application is run.\n\nIn general these directories need to be manually created\nby the application at runtime, before accessing files or folders\nin it is possible.\n\nTherefore, it is also allowed to create all of these folders via\nthe `mkdir` command.\n\n#### Denied Permissions\n\nThis default permission set prevents access to critical components\nof the Tauri application by default.\nOn Windows the webview data folder access is denied.\n\n","permissions":["create-app-specific-dirs","read-app-specific-dirs-recursive","deny-default"]},"permissions":{"allow-copy-file":{"identifier":"allow-copy-file","description":"Enables the copy_file command without any pre-configured scope.","commands":{"allow":["copy_file"],"deny":[]}},"allow-create":{"identifier":"allow-create","description":"Enables the create command without any pre-configured scope.","commands":{"allow":["create"],"deny":[]}},"allow-exists":{"identifier":"allow-exists","description":"Enables the exists command without any pre-configured scope.","commands":{"allow":["exists"],"deny":[]}},"allow-fstat":{"identifier":"allow-fstat","description":"Enables the fstat command without any pre-configured scope.","commands":{"allow":["fstat"],"deny":[]}},"allow-ftruncate":{"identifier":"allow-ftruncate","description":"Enables the ftruncate command without any pre-configured scope.","commands":{"allow":["ftruncate"],"deny":[]}},"allow-lstat":{"identifier":"allow-lstat","description":"Enables the lstat command without any pre-configured scope.","commands":{"allow":["lstat"],"deny":[]}},"allow-mkdir":{"identifier":"allow-mkdir","description":"Enables the mkdir command without any pre-configured scope.","commands":{"allow":["mkdir"],"deny":[]}},"allow-open":{"identifier":"allow-open","description":"Enables the open command without any pre-configured scope.","commands":{"allow":["open"],"deny":[]}},"allow-read":{"identifier":"allow-read","description":"Enables the read command without any pre-configured scope.","commands":{"allow":["read"],"deny":[]}},"allow-read-dir":{"identifier":"allow-read-dir","description":"Enables the read_dir command without any pre-configured scope.","commands":{"allow":["read_dir"],"deny":[]}},"allow-read-file":{"identifier":"allow-read-file","description":"Enables the read_file command without any pre-configured scope.","commands":{"allow":["read_file"],"deny":[]}},"allow-read-text-file":{"identifier":"allow-read-text-file","description":"Enables the read_text_file command without any pre-configured scope.","commands":{"allow":["read_text_file"],"deny":[]}},"allow-read-text-file-lines":{"identifier":"allow-read-text-file-lines","description":"Enables the read_text_file_lines command without any pre-configured scope.","commands":{"allow":["read_text_file_lines"],"deny":[]}},"allow-read-text-file-lines-next":{"identifier":"allow-read-text-file-lines-next","description":"Enables the read_text_file_lines_next command without any pre-configured scope.","commands":{"allow":["read_text_file_lines_next"],"deny":[]}},"allow-remove":{"identifier":"allow-remove","description":"Enables the remove command without any pre-configured scope.","commands":{"allow":["remove"],"deny":[]}},"allow-rename":{"identifier":"allow-rename","description":"Enables the rename command without any pre-configured scope.","commands":{"allow":["rename"],"deny":[]}},"allow-seek":{"identifier":"allow-seek","description":"Enables the seek command without any pre-configured scope.","commands":{"allow":["seek"],"deny":[]}},"allow-stat":{"identifier":"allow-stat","description":"Enables the stat command without any pre-configured scope.","commands":{"allow":["stat"],"deny":[]}},"allow-truncate":{"identifier":"allow-truncate","description":"Enables the truncate command without any pre-configured scope.","commands":{"allow":["truncate"],"deny":[]}},"allow-unwatch":{"identifier":"allow-unwatch","description":"Enables the unwatch command without any pre-configured scope.","commands":{"allow":["unwatch"],"deny":[]}},"allow-watch":{"identifier":"allow-watch","description":"Enables the watch command without any pre-configured scope.","commands":{"allow":["watch"],"deny":[]}},"allow-write":{"identifier":"allow-write","description":"Enables the write command without any pre-configured scope.","commands":{"allow":["write"],"deny":[]}},"allow-write-file":{"identifier":"allow-write-file","description":"Enables the write_file command without any pre-configured scope.","commands":{"allow":["write_file"],"deny":[]}},"allow-write-text-file":{"identifier":"allow-write-text-file","description":"Enables the write_text_file command without any pre-configured scope.","commands":{"allow":["write_text_file"],"deny":[]}},"create-app-specific-dirs":{"identifier":"create-app-specific-dirs","description":"This permissions allows to create the application specific directories.\n","commands":{"allow":["mkdir"],"deny":[]},"scope":{"allow":[{"path":"$APPCONFIG"},{"path":"$APPDATA"},{"path":"$APPLOCALDATA"},{"path":"$APPCACHE"},{"path":"$APPLOG"}]}},"deny-copy-file":{"identifier":"deny-copy-file","description":"Denies the copy_file command without any pre-configured scope.","commands":{"allow":[],"deny":["copy_file"]}},"deny-create":{"identifier":"deny-create","description":"Denies the create command without any pre-configured scope.","commands":{"allow":[],"deny":["create"]}},"deny-exists":{"identifier":"deny-exists","description":"Denies the exists command without any pre-configured scope.","commands":{"allow":[],"deny":["exists"]}},"deny-fstat":{"identifier":"deny-fstat","description":"Denies the fstat command without any pre-configured scope.","commands":{"allow":[],"deny":["fstat"]}},"deny-ftruncate":{"identifier":"deny-ftruncate","description":"Denies the ftruncate command without any pre-configured scope.","commands":{"allow":[],"deny":["ftruncate"]}},"deny-lstat":{"identifier":"deny-lstat","description":"Denies the lstat command without any pre-configured scope.","commands":{"allow":[],"deny":["lstat"]}},"deny-mkdir":{"identifier":"deny-mkdir","description":"Denies the mkdir command without any pre-configured scope.","commands":{"allow":[],"deny":["mkdir"]}},"deny-open":{"identifier":"deny-open","description":"Denies the open command without any pre-configured scope.","commands":{"allow":[],"deny":["open"]}},"deny-read":{"identifier":"deny-read","description":"Denies the read command without any pre-configured scope.","commands":{"allow":[],"deny":["read"]}},"deny-read-dir":{"identifier":"deny-read-dir","description":"Denies the read_dir command without any pre-configured scope.","commands":{"allow":[],"deny":["read_dir"]}},"deny-read-file":{"identifier":"deny-read-file","description":"Denies the read_file command without any pre-configured scope.","commands":{"allow":[],"deny":["read_file"]}},"deny-read-text-file":{"identifier":"deny-read-text-file","description":"Denies the read_text_file command without any pre-configured scope.","commands":{"allow":[],"deny":["read_text_file"]}},"deny-read-text-file-lines":{"identifier":"deny-read-text-file-lines","description":"Denies the read_text_file_lines command without any pre-configured scope.","commands":{"allow":[],"deny":["read_text_file_lines"]}},"deny-read-text-file-lines-next":{"identifier":"deny-read-text-file-lines-next","description":"Denies the read_text_file_lines_next command without any pre-configured scope.","commands":{"allow":[],"deny":["read_text_file_lines_next"]}},"deny-remove":{"identifier":"deny-remove","description":"Denies the remove command without any pre-configured scope.","commands":{"allow":[],"deny":["remove"]}},"deny-rename":{"identifier":"deny-rename","description":"Denies the rename command without any pre-configured scope.","commands":{"allow":[],"deny":["rename"]}},"deny-seek":{"identifier":"deny-seek","description":"Denies the seek command without any pre-configured scope.","commands":{"allow":[],"deny":["seek"]}},"deny-stat":{"identifier":"deny-stat","description":"Denies the stat command without any pre-configured scope.","commands":{"allow":[],"deny":["stat"]}},"deny-truncate":{"identifier":"deny-truncate","description":"Denies the truncate command without any pre-configured scope.","commands":{"allow":[],"deny":["truncate"]}},"deny-unwatch":{"identifier":"deny-unwatch","description":"Denies the unwatch command without any pre-configured scope.","commands":{"allow":[],"deny":["unwatch"]}},"deny-watch":{"identifier":"deny-watch","description":"Denies the watch command without any pre-configured scope.","commands":{"allow":[],"deny":["watch"]}},"deny-webview-data-linux":{"identifier":"deny-webview-data-linux","description":"This denies read access to the\n`$APPLOCALDATA` folder on linux as the webview data and configuration values are stored here.\nAllowing access can lead to sensitive information disclosure and should be well considered.","commands":{"allow":[],"deny":[]}},"deny-webview-data-windows":{"identifier":"deny-webview-data-windows","description":"This denies read access to the\n`$APPLOCALDATA/EBWebView` folder on windows as the webview data and configuration values are stored here.\nAllowing access can lead to sensitive information disclosure and should be well considered.","commands":{"allow":[],"deny":[]}},"deny-write":{"identifier":"deny-write","description":"Denies the write command without any pre-configured scope.","commands":{"allow":[],"deny":["write"]}},"deny-write-file":{"identifier":"deny-write-file","description":"Denies the write_file command without any pre-configured scope.","commands":{"allow":[],"deny":["write_file"]}},"deny-write-text-file":{"identifier":"deny-write-text-file","description":"Denies the write_text_file command without any pre-configured scope.","commands":{"allow":[],"deny":["write_text_file"]}},"read-all":{"identifier":"read-all","description":"This enables all read related commands without any pre-configured accessible paths.","commands":{"allow":["read_dir","read_file","read","open","read_text_file","read_text_file_lines","read_text_file_lines_next","seek","stat","lstat","fstat","exists","watch","unwatch"],"deny":[]}},"read-app-specific-dirs-recursive":{"identifier":"read-app-specific-dirs-recursive","description":"This permission allows recursive read functionality on the application\nspecific base directories. \n","commands":{"allow":["read_dir","read_file","read_text_file","read_text_file_lines","read_text_file_lines_next","exists"],"deny":[]},"scope":{"allow":[{"path":"$APPCONFIG/**"},{"path":"$APPDATA/**"},{"path":"$APPLOCALDATA/**"},{"path":"$APPCACHE/**"},{"path":"$APPLOG/**"}]}},"read-dirs":{"identifier":"read-dirs","description":"This enables directory read and file metadata related commands without any pre-configured accessible paths.","commands":{"allow":["read_dir","stat","lstat","fstat","exists"],"deny":[]}},"read-files":{"identifier":"read-files","description":"This enables file read related commands without any pre-configured accessible paths.","commands":{"allow":["read_file","read","open","read_text_file","read_text_file_lines","read_text_file_lines_next","seek","stat","lstat","fstat","exists"],"deny":[]}},"read-meta":{"identifier":"read-meta","description":"This enables all index or metadata related commands without any pre-configured accessible paths.","commands":{"allow":["read_dir","stat","lstat","fstat","exists"],"deny":[]}},"scope":{"identifier":"scope","description":"An empty permission you can use to modify the global scope.","commands":{"allow":[],"deny":[]}},"scope-app":{"identifier":"scope-app","description":"This scope permits access to all files and list content of top level directories in the `$APP`folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$APP"},{"path":"$APP/*"}]}},"scope-app-index":{"identifier":"scope-app-index","description":"This scope permits to list all files and folders in the `$APP`folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$APP"}]}},"scope-app-recursive":{"identifier":"scope-app-recursive","description":"This scope permits recursive access to the complete `$APP` folder, including sub directories and files.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$APP"},{"path":"$APP/**"}]}},"scope-appcache":{"identifier":"scope-appcache","description":"This scope permits access to all files and list content of top level directories in the `$APPCACHE`folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$APPCACHE"},{"path":"$APPCACHE/*"}]}},"scope-appcache-index":{"identifier":"scope-appcache-index","description":"This scope permits to list all files and folders in the `$APPCACHE`folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$APPCACHE"}]}},"scope-appcache-recursive":{"identifier":"scope-appcache-recursive","description":"This scope permits recursive access to the complete `$APPCACHE` folder, including sub directories and files.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$APPCACHE"},{"path":"$APPCACHE/**"}]}},"scope-appconfig":{"identifier":"scope-appconfig","description":"This scope permits access to all files and list content of top level directories in the `$APPCONFIG`folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$APPCONFIG"},{"path":"$APPCONFIG/*"}]}},"scope-appconfig-index":{"identifier":"scope-appconfig-index","description":"This scope permits to list all files and folders in the `$APPCONFIG`folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$APPCONFIG"}]}},"scope-appconfig-recursive":{"identifier":"scope-appconfig-recursive","description":"This scope permits recursive access to the complete `$APPCONFIG` folder, including sub directories and files.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$APPCONFIG"},{"path":"$APPCONFIG/**"}]}},"scope-appdata":{"identifier":"scope-appdata","description":"This scope permits access to all files and list content of top level directories in the `$APPDATA`folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$APPDATA"},{"path":"$APPDATA/*"}]}},"scope-appdata-index":{"identifier":"scope-appdata-index","description":"This scope permits to list all files and folders in the `$APPDATA`folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$APPDATA"}]}},"scope-appdata-recursive":{"identifier":"scope-appdata-recursive","description":"This scope permits recursive access to the complete `$APPDATA` folder, including sub directories and files.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$APPDATA"},{"path":"$APPDATA/**"}]}},"scope-applocaldata":{"identifier":"scope-applocaldata","description":"This scope permits access to all files and list content of top level directories in the `$APPLOCALDATA`folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$APPLOCALDATA"},{"path":"$APPLOCALDATA/*"}]}},"scope-applocaldata-index":{"identifier":"scope-applocaldata-index","description":"This scope permits to list all files and folders in the `$APPLOCALDATA`folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$APPLOCALDATA"}]}},"scope-applocaldata-recursive":{"identifier":"scope-applocaldata-recursive","description":"This scope permits recursive access to the complete `$APPLOCALDATA` folder, including sub directories and files.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$APPLOCALDATA"},{"path":"$APPLOCALDATA/**"}]}},"scope-applog":{"identifier":"scope-applog","description":"This scope permits access to all files and list content of top level directories in the `$APPLOG`folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$APPLOG"},{"path":"$APPLOG/*"}]}},"scope-applog-index":{"identifier":"scope-applog-index","description":"This scope permits to list all files and folders in the `$APPLOG`folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$APPLOG"}]}},"scope-applog-recursive":{"identifier":"scope-applog-recursive","description":"This scope permits recursive access to the complete `$APPLOG` folder, including sub directories and files.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$APPLOG"},{"path":"$APPLOG/**"}]}},"scope-audio":{"identifier":"scope-audio","description":"This scope permits access to all files and list content of top level directories in the `$AUDIO`folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$AUDIO"},{"path":"$AUDIO/*"}]}},"scope-audio-index":{"identifier":"scope-audio-index","description":"This scope permits to list all files and folders in the `$AUDIO`folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$AUDIO"}]}},"scope-audio-recursive":{"identifier":"scope-audio-recursive","description":"This scope permits recursive access to the complete `$AUDIO` folder, including sub directories and files.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$AUDIO"},{"path":"$AUDIO/**"}]}},"scope-cache":{"identifier":"scope-cache","description":"This scope permits access to all files and list content of top level directories in the `$CACHE`folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$CACHE"},{"path":"$CACHE/*"}]}},"scope-cache-index":{"identifier":"scope-cache-index","description":"This scope permits to list all files and folders in the `$CACHE`folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$CACHE"}]}},"scope-cache-recursive":{"identifier":"scope-cache-recursive","description":"This scope permits recursive access to the complete `$CACHE` folder, including sub directories and files.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$CACHE"},{"path":"$CACHE/**"}]}},"scope-config":{"identifier":"scope-config","description":"This scope permits access to all files and list content of top level directories in the `$CONFIG`folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$CONFIG"},{"path":"$CONFIG/*"}]}},"scope-config-index":{"identifier":"scope-config-index","description":"This scope permits to list all files and folders in the `$CONFIG`folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$CONFIG"}]}},"scope-config-recursive":{"identifier":"scope-config-recursive","description":"This scope permits recursive access to the complete `$CONFIG` folder, including sub directories and files.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$CONFIG"},{"path":"$CONFIG/**"}]}},"scope-data":{"identifier":"scope-data","description":"This scope permits access to all files and list content of top level directories in the `$DATA`folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$DATA"},{"path":"$DATA/*"}]}},"scope-data-index":{"identifier":"scope-data-index","description":"This scope permits to list all files and folders in the `$DATA`folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$DATA"}]}},"scope-data-recursive":{"identifier":"scope-data-recursive","description":"This scope permits recursive access to the complete `$DATA` folder, including sub directories and files.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$DATA"},{"path":"$DATA/**"}]}},"scope-desktop":{"identifier":"scope-desktop","description":"This scope permits access to all files and list content of top level directories in the `$DESKTOP`folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$DESKTOP"},{"path":"$DESKTOP/*"}]}},"scope-desktop-index":{"identifier":"scope-desktop-index","description":"This scope permits to list all files and folders in the `$DESKTOP`folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$DESKTOP"}]}},"scope-desktop-recursive":{"identifier":"scope-desktop-recursive","description":"This scope permits recursive access to the complete `$DESKTOP` folder, including sub directories and files.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$DESKTOP"},{"path":"$DESKTOP/**"}]}},"scope-document":{"identifier":"scope-document","description":"This scope permits access to all files and list content of top level directories in the `$DOCUMENT`folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$DOCUMENT"},{"path":"$DOCUMENT/*"}]}},"scope-document-index":{"identifier":"scope-document-index","description":"This scope permits to list all files and folders in the `$DOCUMENT`folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$DOCUMENT"}]}},"scope-document-recursive":{"identifier":"scope-document-recursive","description":"This scope permits recursive access to the complete `$DOCUMENT` folder, including sub directories and files.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$DOCUMENT"},{"path":"$DOCUMENT/**"}]}},"scope-download":{"identifier":"scope-download","description":"This scope permits access to all files and list content of top level directories in the `$DOWNLOAD`folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$DOWNLOAD"},{"path":"$DOWNLOAD/*"}]}},"scope-download-index":{"identifier":"scope-download-index","description":"This scope permits to list all files and folders in the `$DOWNLOAD`folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$DOWNLOAD"}]}},"scope-download-recursive":{"identifier":"scope-download-recursive","description":"This scope permits recursive access to the complete `$DOWNLOAD` folder, including sub directories and files.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$DOWNLOAD"},{"path":"$DOWNLOAD/**"}]}},"scope-exe":{"identifier":"scope-exe","description":"This scope permits access to all files and list content of top level directories in the `$EXE`folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$EXE"},{"path":"$EXE/*"}]}},"scope-exe-index":{"identifier":"scope-exe-index","description":"This scope permits to list all files and folders in the `$EXE`folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$EXE"}]}},"scope-exe-recursive":{"identifier":"scope-exe-recursive","description":"This scope permits recursive access to the complete `$EXE` folder, including sub directories and files.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$EXE"},{"path":"$EXE/**"}]}},"scope-font":{"identifier":"scope-font","description":"This scope permits access to all files and list content of top level directories in the `$FONT`folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$FONT"},{"path":"$FONT/*"}]}},"scope-font-index":{"identifier":"scope-font-index","description":"This scope permits to list all files and folders in the `$FONT`folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$FONT"}]}},"scope-font-recursive":{"identifier":"scope-font-recursive","description":"This scope permits recursive access to the complete `$FONT` folder, including sub directories and files.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$FONT"},{"path":"$FONT/**"}]}},"scope-home":{"identifier":"scope-home","description":"This scope permits access to all files and list content of top level directories in the `$HOME`folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$HOME"},{"path":"$HOME/*"}]}},"scope-home-index":{"identifier":"scope-home-index","description":"This scope permits to list all files and folders in the `$HOME`folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$HOME"}]}},"scope-home-recursive":{"identifier":"scope-home-recursive","description":"This scope permits recursive access to the complete `$HOME` folder, including sub directories and files.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$HOME"},{"path":"$HOME/**"}]}},"scope-localdata":{"identifier":"scope-localdata","description":"This scope permits access to all files and list content of top level directories in the `$LOCALDATA`folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$LOCALDATA"},{"path":"$LOCALDATA/*"}]}},"scope-localdata-index":{"identifier":"scope-localdata-index","description":"This scope permits to list all files and folders in the `$LOCALDATA`folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$LOCALDATA"}]}},"scope-localdata-recursive":{"identifier":"scope-localdata-recursive","description":"This scope permits recursive access to the complete `$LOCALDATA` folder, including sub directories and files.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$LOCALDATA"},{"path":"$LOCALDATA/**"}]}},"scope-log":{"identifier":"scope-log","description":"This scope permits access to all files and list content of top level directories in the `$LOG`folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$LOG"},{"path":"$LOG/*"}]}},"scope-log-index":{"identifier":"scope-log-index","description":"This scope permits to list all files and folders in the `$LOG`folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$LOG"}]}},"scope-log-recursive":{"identifier":"scope-log-recursive","description":"This scope permits recursive access to the complete `$LOG` folder, including sub directories and files.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$LOG"},{"path":"$LOG/**"}]}},"scope-picture":{"identifier":"scope-picture","description":"This scope permits access to all files and list content of top level directories in the `$PICTURE`folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$PICTURE"},{"path":"$PICTURE/*"}]}},"scope-picture-index":{"identifier":"scope-picture-index","description":"This scope permits to list all files and folders in the `$PICTURE`folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$PICTURE"}]}},"scope-picture-recursive":{"identifier":"scope-picture-recursive","description":"This scope permits recursive access to the complete `$PICTURE` folder, including sub directories and files.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$PICTURE"},{"path":"$PICTURE/**"}]}},"scope-public":{"identifier":"scope-public","description":"This scope permits access to all files and list content of top level directories in the `$PUBLIC`folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$PUBLIC"},{"path":"$PUBLIC/*"}]}},"scope-public-index":{"identifier":"scope-public-index","description":"This scope permits to list all files and folders in the `$PUBLIC`folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$PUBLIC"}]}},"scope-public-recursive":{"identifier":"scope-public-recursive","description":"This scope permits recursive access to the complete `$PUBLIC` folder, including sub directories and files.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$PUBLIC"},{"path":"$PUBLIC/**"}]}},"scope-resource":{"identifier":"scope-resource","description":"This scope permits access to all files and list content of top level directories in the `$RESOURCE`folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$RESOURCE"},{"path":"$RESOURCE/*"}]}},"scope-resource-index":{"identifier":"scope-resource-index","description":"This scope permits to list all files and folders in the `$RESOURCE`folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$RESOURCE"}]}},"scope-resource-recursive":{"identifier":"scope-resource-recursive","description":"This scope permits recursive access to the complete `$RESOURCE` folder, including sub directories and files.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$RESOURCE"},{"path":"$RESOURCE/**"}]}},"scope-runtime":{"identifier":"scope-runtime","description":"This scope permits access to all files and list content of top level directories in the `$RUNTIME`folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$RUNTIME"},{"path":"$RUNTIME/*"}]}},"scope-runtime-index":{"identifier":"scope-runtime-index","description":"This scope permits to list all files and folders in the `$RUNTIME`folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$RUNTIME"}]}},"scope-runtime-recursive":{"identifier":"scope-runtime-recursive","description":"This scope permits recursive access to the complete `$RUNTIME` folder, including sub directories and files.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$RUNTIME"},{"path":"$RUNTIME/**"}]}},"scope-temp":{"identifier":"scope-temp","description":"This scope permits access to all files and list content of top level directories in the `$TEMP`folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$TEMP"},{"path":"$TEMP/*"}]}},"scope-temp-index":{"identifier":"scope-temp-index","description":"This scope permits to list all files and folders in the `$TEMP`folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$TEMP"}]}},"scope-temp-recursive":{"identifier":"scope-temp-recursive","description":"This scope permits recursive access to the complete `$TEMP` folder, including sub directories and files.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$TEMP"},{"path":"$TEMP/**"}]}},"scope-template":{"identifier":"scope-template","description":"This scope permits access to all files and list content of top level directories in the `$TEMPLATE`folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$TEMPLATE"},{"path":"$TEMPLATE/*"}]}},"scope-template-index":{"identifier":"scope-template-index","description":"This scope permits to list all files and folders in the `$TEMPLATE`folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$TEMPLATE"}]}},"scope-template-recursive":{"identifier":"scope-template-recursive","description":"This scope permits recursive access to the complete `$TEMPLATE` folder, including sub directories and files.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$TEMPLATE"},{"path":"$TEMPLATE/**"}]}},"scope-video":{"identifier":"scope-video","description":"This scope permits access to all files and list content of top level directories in the `$VIDEO`folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$VIDEO"},{"path":"$VIDEO/*"}]}},"scope-video-index":{"identifier":"scope-video-index","description":"This scope permits to list all files and folders in the `$VIDEO`folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$VIDEO"}]}},"scope-video-recursive":{"identifier":"scope-video-recursive","description":"This scope permits recursive access to the complete `$VIDEO` folder, including sub directories and files.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$VIDEO"},{"path":"$VIDEO/**"}]}},"write-all":{"identifier":"write-all","description":"This enables all write related commands without any pre-configured accessible paths.","commands":{"allow":["mkdir","create","copy_file","remove","rename","truncate","ftruncate","write","write_file","write_text_file"],"deny":[]}},"write-files":{"identifier":"write-files","description":"This enables all file write related commands without any pre-configured accessible paths.","commands":{"allow":["create","copy_file","remove","rename","truncate","ftruncate","write","write_file","write_text_file"],"deny":[]}}},"permission_sets":{"allow-app-meta":{"identifier":"allow-app-meta","description":"This allows non-recursive read access to metadata of the `$APP` folder, including file listing and statistics.","permissions":["read-meta","scope-app-index"]},"allow-app-meta-recursive":{"identifier":"allow-app-meta-recursive","description":"This allows full recursive read access to metadata of the `$APP` folder, including file listing and statistics.","permissions":["read-meta","scope-app-recursive"]},"allow-app-read":{"identifier":"allow-app-read","description":"This allows non-recursive read access to the `$APP` folder.","permissions":["read-all","scope-app"]},"allow-app-read-recursive":{"identifier":"allow-app-read-recursive","description":"This allows full recursive read access to the complete `$APP` folder, files and subdirectories.","permissions":["read-all","scope-app-recursive"]},"allow-app-write":{"identifier":"allow-app-write","description":"This allows non-recursive write access to the `$APP` folder.","permissions":["write-all","scope-app"]},"allow-app-write-recursive":{"identifier":"allow-app-write-recursive","description":"This allows full recursive write access to the complete `$APP` folder, files and subdirectories.","permissions":["write-all","scope-app-recursive"]},"allow-appcache-meta":{"identifier":"allow-appcache-meta","description":"This allows non-recursive read access to metadata of the `$APPCACHE` folder, including file listing and statistics.","permissions":["read-meta","scope-appcache-index"]},"allow-appcache-meta-recursive":{"identifier":"allow-appcache-meta-recursive","description":"This allows full recursive read access to metadata of the `$APPCACHE` folder, including file listing and statistics.","permissions":["read-meta","scope-appcache-recursive"]},"allow-appcache-read":{"identifier":"allow-appcache-read","description":"This allows non-recursive read access to the `$APPCACHE` folder.","permissions":["read-all","scope-appcache"]},"allow-appcache-read-recursive":{"identifier":"allow-appcache-read-recursive","description":"This allows full recursive read access to the complete `$APPCACHE` folder, files and subdirectories.","permissions":["read-all","scope-appcache-recursive"]},"allow-appcache-write":{"identifier":"allow-appcache-write","description":"This allows non-recursive write access to the `$APPCACHE` folder.","permissions":["write-all","scope-appcache"]},"allow-appcache-write-recursive":{"identifier":"allow-appcache-write-recursive","description":"This allows full recursive write access to the complete `$APPCACHE` folder, files and subdirectories.","permissions":["write-all","scope-appcache-recursive"]},"allow-appconfig-meta":{"identifier":"allow-appconfig-meta","description":"This allows non-recursive read access to metadata of the `$APPCONFIG` folder, including file listing and statistics.","permissions":["read-meta","scope-appconfig-index"]},"allow-appconfig-meta-recursive":{"identifier":"allow-appconfig-meta-recursive","description":"This allows full recursive read access to metadata of the `$APPCONFIG` folder, including file listing and statistics.","permissions":["read-meta","scope-appconfig-recursive"]},"allow-appconfig-read":{"identifier":"allow-appconfig-read","description":"This allows non-recursive read access to the `$APPCONFIG` folder.","permissions":["read-all","scope-appconfig"]},"allow-appconfig-read-recursive":{"identifier":"allow-appconfig-read-recursive","description":"This allows full recursive read access to the complete `$APPCONFIG` folder, files and subdirectories.","permissions":["read-all","scope-appconfig-recursive"]},"allow-appconfig-write":{"identifier":"allow-appconfig-write","description":"This allows non-recursive write access to the `$APPCONFIG` folder.","permissions":["write-all","scope-appconfig"]},"allow-appconfig-write-recursive":{"identifier":"allow-appconfig-write-recursive","description":"This allows full recursive write access to the complete `$APPCONFIG` folder, files and subdirectories.","permissions":["write-all","scope-appconfig-recursive"]},"allow-appdata-meta":{"identifier":"allow-appdata-meta","description":"This allows non-recursive read access to metadata of the `$APPDATA` folder, including file listing and statistics.","permissions":["read-meta","scope-appdata-index"]},"allow-appdata-meta-recursive":{"identifier":"allow-appdata-meta-recursive","description":"This allows full recursive read access to metadata of the `$APPDATA` folder, including file listing and statistics.","permissions":["read-meta","scope-appdata-recursive"]},"allow-appdata-read":{"identifier":"allow-appdata-read","description":"This allows non-recursive read access to the `$APPDATA` folder.","permissions":["read-all","scope-appdata"]},"allow-appdata-read-recursive":{"identifier":"allow-appdata-read-recursive","description":"This allows full recursive read access to the complete `$APPDATA` folder, files and subdirectories.","permissions":["read-all","scope-appdata-recursive"]},"allow-appdata-write":{"identifier":"allow-appdata-write","description":"This allows non-recursive write access to the `$APPDATA` folder.","permissions":["write-all","scope-appdata"]},"allow-appdata-write-recursive":{"identifier":"allow-appdata-write-recursive","description":"This allows full recursive write access to the complete `$APPDATA` folder, files and subdirectories.","permissions":["write-all","scope-appdata-recursive"]},"allow-applocaldata-meta":{"identifier":"allow-applocaldata-meta","description":"This allows non-recursive read access to metadata of the `$APPLOCALDATA` folder, including file listing and statistics.","permissions":["read-meta","scope-applocaldata-index"]},"allow-applocaldata-meta-recursive":{"identifier":"allow-applocaldata-meta-recursive","description":"This allows full recursive read access to metadata of the `$APPLOCALDATA` folder, including file listing and statistics.","permissions":["read-meta","scope-applocaldata-recursive"]},"allow-applocaldata-read":{"identifier":"allow-applocaldata-read","description":"This allows non-recursive read access to the `$APPLOCALDATA` folder.","permissions":["read-all","scope-applocaldata"]},"allow-applocaldata-read-recursive":{"identifier":"allow-applocaldata-read-recursive","description":"This allows full recursive read access to the complete `$APPLOCALDATA` folder, files and subdirectories.","permissions":["read-all","scope-applocaldata-recursive"]},"allow-applocaldata-write":{"identifier":"allow-applocaldata-write","description":"This allows non-recursive write access to the `$APPLOCALDATA` folder.","permissions":["write-all","scope-applocaldata"]},"allow-applocaldata-write-recursive":{"identifier":"allow-applocaldata-write-recursive","description":"This allows full recursive write access to the complete `$APPLOCALDATA` folder, files and subdirectories.","permissions":["write-all","scope-applocaldata-recursive"]},"allow-applog-meta":{"identifier":"allow-applog-meta","description":"This allows non-recursive read access to metadata of the `$APPLOG` folder, including file listing and statistics.","permissions":["read-meta","scope-applog-index"]},"allow-applog-meta-recursive":{"identifier":"allow-applog-meta-recursive","description":"This allows full recursive read access to metadata of the `$APPLOG` folder, including file listing and statistics.","permissions":["read-meta","scope-applog-recursive"]},"allow-applog-read":{"identifier":"allow-applog-read","description":"This allows non-recursive read access to the `$APPLOG` folder.","permissions":["read-all","scope-applog"]},"allow-applog-read-recursive":{"identifier":"allow-applog-read-recursive","description":"This allows full recursive read access to the complete `$APPLOG` folder, files and subdirectories.","permissions":["read-all","scope-applog-recursive"]},"allow-applog-write":{"identifier":"allow-applog-write","description":"This allows non-recursive write access to the `$APPLOG` folder.","permissions":["write-all","scope-applog"]},"allow-applog-write-recursive":{"identifier":"allow-applog-write-recursive","description":"This allows full recursive write access to the complete `$APPLOG` folder, files and subdirectories.","permissions":["write-all","scope-applog-recursive"]},"allow-audio-meta":{"identifier":"allow-audio-meta","description":"This allows non-recursive read access to metadata of the `$AUDIO` folder, including file listing and statistics.","permissions":["read-meta","scope-audio-index"]},"allow-audio-meta-recursive":{"identifier":"allow-audio-meta-recursive","description":"This allows full recursive read access to metadata of the `$AUDIO` folder, including file listing and statistics.","permissions":["read-meta","scope-audio-recursive"]},"allow-audio-read":{"identifier":"allow-audio-read","description":"This allows non-recursive read access to the `$AUDIO` folder.","permissions":["read-all","scope-audio"]},"allow-audio-read-recursive":{"identifier":"allow-audio-read-recursive","description":"This allows full recursive read access to the complete `$AUDIO` folder, files and subdirectories.","permissions":["read-all","scope-audio-recursive"]},"allow-audio-write":{"identifier":"allow-audio-write","description":"This allows non-recursive write access to the `$AUDIO` folder.","permissions":["write-all","scope-audio"]},"allow-audio-write-recursive":{"identifier":"allow-audio-write-recursive","description":"This allows full recursive write access to the complete `$AUDIO` folder, files and subdirectories.","permissions":["write-all","scope-audio-recursive"]},"allow-cache-meta":{"identifier":"allow-cache-meta","description":"This allows non-recursive read access to metadata of the `$CACHE` folder, including file listing and statistics.","permissions":["read-meta","scope-cache-index"]},"allow-cache-meta-recursive":{"identifier":"allow-cache-meta-recursive","description":"This allows full recursive read access to metadata of the `$CACHE` folder, including file listing and statistics.","permissions":["read-meta","scope-cache-recursive"]},"allow-cache-read":{"identifier":"allow-cache-read","description":"This allows non-recursive read access to the `$CACHE` folder.","permissions":["read-all","scope-cache"]},"allow-cache-read-recursive":{"identifier":"allow-cache-read-recursive","description":"This allows full recursive read access to the complete `$CACHE` folder, files and subdirectories.","permissions":["read-all","scope-cache-recursive"]},"allow-cache-write":{"identifier":"allow-cache-write","description":"This allows non-recursive write access to the `$CACHE` folder.","permissions":["write-all","scope-cache"]},"allow-cache-write-recursive":{"identifier":"allow-cache-write-recursive","description":"This allows full recursive write access to the complete `$CACHE` folder, files and subdirectories.","permissions":["write-all","scope-cache-recursive"]},"allow-config-meta":{"identifier":"allow-config-meta","description":"This allows non-recursive read access to metadata of the `$CONFIG` folder, including file listing and statistics.","permissions":["read-meta","scope-config-index"]},"allow-config-meta-recursive":{"identifier":"allow-config-meta-recursive","description":"This allows full recursive read access to metadata of the `$CONFIG` folder, including file listing and statistics.","permissions":["read-meta","scope-config-recursive"]},"allow-config-read":{"identifier":"allow-config-read","description":"This allows non-recursive read access to the `$CONFIG` folder.","permissions":["read-all","scope-config"]},"allow-config-read-recursive":{"identifier":"allow-config-read-recursive","description":"This allows full recursive read access to the complete `$CONFIG` folder, files and subdirectories.","permissions":["read-all","scope-config-recursive"]},"allow-config-write":{"identifier":"allow-config-write","description":"This allows non-recursive write access to the `$CONFIG` folder.","permissions":["write-all","scope-config"]},"allow-config-write-recursive":{"identifier":"allow-config-write-recursive","description":"This allows full recursive write access to the complete `$CONFIG` folder, files and subdirectories.","permissions":["write-all","scope-config-recursive"]},"allow-data-meta":{"identifier":"allow-data-meta","description":"This allows non-recursive read access to metadata of the `$DATA` folder, including file listing and statistics.","permissions":["read-meta","scope-data-index"]},"allow-data-meta-recursive":{"identifier":"allow-data-meta-recursive","description":"This allows full recursive read access to metadata of the `$DATA` folder, including file listing and statistics.","permissions":["read-meta","scope-data-recursive"]},"allow-data-read":{"identifier":"allow-data-read","description":"This allows non-recursive read access to the `$DATA` folder.","permissions":["read-all","scope-data"]},"allow-data-read-recursive":{"identifier":"allow-data-read-recursive","description":"This allows full recursive read access to the complete `$DATA` folder, files and subdirectories.","permissions":["read-all","scope-data-recursive"]},"allow-data-write":{"identifier":"allow-data-write","description":"This allows non-recursive write access to the `$DATA` folder.","permissions":["write-all","scope-data"]},"allow-data-write-recursive":{"identifier":"allow-data-write-recursive","description":"This allows full recursive write access to the complete `$DATA` folder, files and subdirectories.","permissions":["write-all","scope-data-recursive"]},"allow-desktop-meta":{"identifier":"allow-desktop-meta","description":"This allows non-recursive read access to metadata of the `$DESKTOP` folder, including file listing and statistics.","permissions":["read-meta","scope-desktop-index"]},"allow-desktop-meta-recursive":{"identifier":"allow-desktop-meta-recursive","description":"This allows full recursive read access to metadata of the `$DESKTOP` folder, including file listing and statistics.","permissions":["read-meta","scope-desktop-recursive"]},"allow-desktop-read":{"identifier":"allow-desktop-read","description":"This allows non-recursive read access to the `$DESKTOP` folder.","permissions":["read-all","scope-desktop"]},"allow-desktop-read-recursive":{"identifier":"allow-desktop-read-recursive","description":"This allows full recursive read access to the complete `$DESKTOP` folder, files and subdirectories.","permissions":["read-all","scope-desktop-recursive"]},"allow-desktop-write":{"identifier":"allow-desktop-write","description":"This allows non-recursive write access to the `$DESKTOP` folder.","permissions":["write-all","scope-desktop"]},"allow-desktop-write-recursive":{"identifier":"allow-desktop-write-recursive","description":"This allows full recursive write access to the complete `$DESKTOP` folder, files and subdirectories.","permissions":["write-all","scope-desktop-recursive"]},"allow-document-meta":{"identifier":"allow-document-meta","description":"This allows non-recursive read access to metadata of the `$DOCUMENT` folder, including file listing and statistics.","permissions":["read-meta","scope-document-index"]},"allow-document-meta-recursive":{"identifier":"allow-document-meta-recursive","description":"This allows full recursive read access to metadata of the `$DOCUMENT` folder, including file listing and statistics.","permissions":["read-meta","scope-document-recursive"]},"allow-document-read":{"identifier":"allow-document-read","description":"This allows non-recursive read access to the `$DOCUMENT` folder.","permissions":["read-all","scope-document"]},"allow-document-read-recursive":{"identifier":"allow-document-read-recursive","description":"This allows full recursive read access to the complete `$DOCUMENT` folder, files and subdirectories.","permissions":["read-all","scope-document-recursive"]},"allow-document-write":{"identifier":"allow-document-write","description":"This allows non-recursive write access to the `$DOCUMENT` folder.","permissions":["write-all","scope-document"]},"allow-document-write-recursive":{"identifier":"allow-document-write-recursive","description":"This allows full recursive write access to the complete `$DOCUMENT` folder, files and subdirectories.","permissions":["write-all","scope-document-recursive"]},"allow-download-meta":{"identifier":"allow-download-meta","description":"This allows non-recursive read access to metadata of the `$DOWNLOAD` folder, including file listing and statistics.","permissions":["read-meta","scope-download-index"]},"allow-download-meta-recursive":{"identifier":"allow-download-meta-recursive","description":"This allows full recursive read access to metadata of the `$DOWNLOAD` folder, including file listing and statistics.","permissions":["read-meta","scope-download-recursive"]},"allow-download-read":{"identifier":"allow-download-read","description":"This allows non-recursive read access to the `$DOWNLOAD` folder.","permissions":["read-all","scope-download"]},"allow-download-read-recursive":{"identifier":"allow-download-read-recursive","description":"This allows full recursive read access to the complete `$DOWNLOAD` folder, files and subdirectories.","permissions":["read-all","scope-download-recursive"]},"allow-download-write":{"identifier":"allow-download-write","description":"This allows non-recursive write access to the `$DOWNLOAD` folder.","permissions":["write-all","scope-download"]},"allow-download-write-recursive":{"identifier":"allow-download-write-recursive","description":"This allows full recursive write access to the complete `$DOWNLOAD` folder, files and subdirectories.","permissions":["write-all","scope-download-recursive"]},"allow-exe-meta":{"identifier":"allow-exe-meta","description":"This allows non-recursive read access to metadata of the `$EXE` folder, including file listing and statistics.","permissions":["read-meta","scope-exe-index"]},"allow-exe-meta-recursive":{"identifier":"allow-exe-meta-recursive","description":"This allows full recursive read access to metadata of the `$EXE` folder, including file listing and statistics.","permissions":["read-meta","scope-exe-recursive"]},"allow-exe-read":{"identifier":"allow-exe-read","description":"This allows non-recursive read access to the `$EXE` folder.","permissions":["read-all","scope-exe"]},"allow-exe-read-recursive":{"identifier":"allow-exe-read-recursive","description":"This allows full recursive read access to the complete `$EXE` folder, files and subdirectories.","permissions":["read-all","scope-exe-recursive"]},"allow-exe-write":{"identifier":"allow-exe-write","description":"This allows non-recursive write access to the `$EXE` folder.","permissions":["write-all","scope-exe"]},"allow-exe-write-recursive":{"identifier":"allow-exe-write-recursive","description":"This allows full recursive write access to the complete `$EXE` folder, files and subdirectories.","permissions":["write-all","scope-exe-recursive"]},"allow-font-meta":{"identifier":"allow-font-meta","description":"This allows non-recursive read access to metadata of the `$FONT` folder, including file listing and statistics.","permissions":["read-meta","scope-font-index"]},"allow-font-meta-recursive":{"identifier":"allow-font-meta-recursive","description":"This allows full recursive read access to metadata of the `$FONT` folder, including file listing and statistics.","permissions":["read-meta","scope-font-recursive"]},"allow-font-read":{"identifier":"allow-font-read","description":"This allows non-recursive read access to the `$FONT` folder.","permissions":["read-all","scope-font"]},"allow-font-read-recursive":{"identifier":"allow-font-read-recursive","description":"This allows full recursive read access to the complete `$FONT` folder, files and subdirectories.","permissions":["read-all","scope-font-recursive"]},"allow-font-write":{"identifier":"allow-font-write","description":"This allows non-recursive write access to the `$FONT` folder.","permissions":["write-all","scope-font"]},"allow-font-write-recursive":{"identifier":"allow-font-write-recursive","description":"This allows full recursive write access to the complete `$FONT` folder, files and subdirectories.","permissions":["write-all","scope-font-recursive"]},"allow-home-meta":{"identifier":"allow-home-meta","description":"This allows non-recursive read access to metadata of the `$HOME` folder, including file listing and statistics.","permissions":["read-meta","scope-home-index"]},"allow-home-meta-recursive":{"identifier":"allow-home-meta-recursive","description":"This allows full recursive read access to metadata of the `$HOME` folder, including file listing and statistics.","permissions":["read-meta","scope-home-recursive"]},"allow-home-read":{"identifier":"allow-home-read","description":"This allows non-recursive read access to the `$HOME` folder.","permissions":["read-all","scope-home"]},"allow-home-read-recursive":{"identifier":"allow-home-read-recursive","description":"This allows full recursive read access to the complete `$HOME` folder, files and subdirectories.","permissions":["read-all","scope-home-recursive"]},"allow-home-write":{"identifier":"allow-home-write","description":"This allows non-recursive write access to the `$HOME` folder.","permissions":["write-all","scope-home"]},"allow-home-write-recursive":{"identifier":"allow-home-write-recursive","description":"This allows full recursive write access to the complete `$HOME` folder, files and subdirectories.","permissions":["write-all","scope-home-recursive"]},"allow-localdata-meta":{"identifier":"allow-localdata-meta","description":"This allows non-recursive read access to metadata of the `$LOCALDATA` folder, including file listing and statistics.","permissions":["read-meta","scope-localdata-index"]},"allow-localdata-meta-recursive":{"identifier":"allow-localdata-meta-recursive","description":"This allows full recursive read access to metadata of the `$LOCALDATA` folder, including file listing and statistics.","permissions":["read-meta","scope-localdata-recursive"]},"allow-localdata-read":{"identifier":"allow-localdata-read","description":"This allows non-recursive read access to the `$LOCALDATA` folder.","permissions":["read-all","scope-localdata"]},"allow-localdata-read-recursive":{"identifier":"allow-localdata-read-recursive","description":"This allows full recursive read access to the complete `$LOCALDATA` folder, files and subdirectories.","permissions":["read-all","scope-localdata-recursive"]},"allow-localdata-write":{"identifier":"allow-localdata-write","description":"This allows non-recursive write access to the `$LOCALDATA` folder.","permissions":["write-all","scope-localdata"]},"allow-localdata-write-recursive":{"identifier":"allow-localdata-write-recursive","description":"This allows full recursive write access to the complete `$LOCALDATA` folder, files and subdirectories.","permissions":["write-all","scope-localdata-recursive"]},"allow-log-meta":{"identifier":"allow-log-meta","description":"This allows non-recursive read access to metadata of the `$LOG` folder, including file listing and statistics.","permissions":["read-meta","scope-log-index"]},"allow-log-meta-recursive":{"identifier":"allow-log-meta-recursive","description":"This allows full recursive read access to metadata of the `$LOG` folder, including file listing and statistics.","permissions":["read-meta","scope-log-recursive"]},"allow-log-read":{"identifier":"allow-log-read","description":"This allows non-recursive read access to the `$LOG` folder.","permissions":["read-all","scope-log"]},"allow-log-read-recursive":{"identifier":"allow-log-read-recursive","description":"This allows full recursive read access to the complete `$LOG` folder, files and subdirectories.","permissions":["read-all","scope-log-recursive"]},"allow-log-write":{"identifier":"allow-log-write","description":"This allows non-recursive write access to the `$LOG` folder.","permissions":["write-all","scope-log"]},"allow-log-write-recursive":{"identifier":"allow-log-write-recursive","description":"This allows full recursive write access to the complete `$LOG` folder, files and subdirectories.","permissions":["write-all","scope-log-recursive"]},"allow-picture-meta":{"identifier":"allow-picture-meta","description":"This allows non-recursive read access to metadata of the `$PICTURE` folder, including file listing and statistics.","permissions":["read-meta","scope-picture-index"]},"allow-picture-meta-recursive":{"identifier":"allow-picture-meta-recursive","description":"This allows full recursive read access to metadata of the `$PICTURE` folder, including file listing and statistics.","permissions":["read-meta","scope-picture-recursive"]},"allow-picture-read":{"identifier":"allow-picture-read","description":"This allows non-recursive read access to the `$PICTURE` folder.","permissions":["read-all","scope-picture"]},"allow-picture-read-recursive":{"identifier":"allow-picture-read-recursive","description":"This allows full recursive read access to the complete `$PICTURE` folder, files and subdirectories.","permissions":["read-all","scope-picture-recursive"]},"allow-picture-write":{"identifier":"allow-picture-write","description":"This allows non-recursive write access to the `$PICTURE` folder.","permissions":["write-all","scope-picture"]},"allow-picture-write-recursive":{"identifier":"allow-picture-write-recursive","description":"This allows full recursive write access to the complete `$PICTURE` folder, files and subdirectories.","permissions":["write-all","scope-picture-recursive"]},"allow-public-meta":{"identifier":"allow-public-meta","description":"This allows non-recursive read access to metadata of the `$PUBLIC` folder, including file listing and statistics.","permissions":["read-meta","scope-public-index"]},"allow-public-meta-recursive":{"identifier":"allow-public-meta-recursive","description":"This allows full recursive read access to metadata of the `$PUBLIC` folder, including file listing and statistics.","permissions":["read-meta","scope-public-recursive"]},"allow-public-read":{"identifier":"allow-public-read","description":"This allows non-recursive read access to the `$PUBLIC` folder.","permissions":["read-all","scope-public"]},"allow-public-read-recursive":{"identifier":"allow-public-read-recursive","description":"This allows full recursive read access to the complete `$PUBLIC` folder, files and subdirectories.","permissions":["read-all","scope-public-recursive"]},"allow-public-write":{"identifier":"allow-public-write","description":"This allows non-recursive write access to the `$PUBLIC` folder.","permissions":["write-all","scope-public"]},"allow-public-write-recursive":{"identifier":"allow-public-write-recursive","description":"This allows full recursive write access to the complete `$PUBLIC` folder, files and subdirectories.","permissions":["write-all","scope-public-recursive"]},"allow-resource-meta":{"identifier":"allow-resource-meta","description":"This allows non-recursive read access to metadata of the `$RESOURCE` folder, including file listing and statistics.","permissions":["read-meta","scope-resource-index"]},"allow-resource-meta-recursive":{"identifier":"allow-resource-meta-recursive","description":"This allows full recursive read access to metadata of the `$RESOURCE` folder, including file listing and statistics.","permissions":["read-meta","scope-resource-recursive"]},"allow-resource-read":{"identifier":"allow-resource-read","description":"This allows non-recursive read access to the `$RESOURCE` folder.","permissions":["read-all","scope-resource"]},"allow-resource-read-recursive":{"identifier":"allow-resource-read-recursive","description":"This allows full recursive read access to the complete `$RESOURCE` folder, files and subdirectories.","permissions":["read-all","scope-resource-recursive"]},"allow-resource-write":{"identifier":"allow-resource-write","description":"This allows non-recursive write access to the `$RESOURCE` folder.","permissions":["write-all","scope-resource"]},"allow-resource-write-recursive":{"identifier":"allow-resource-write-recursive","description":"This allows full recursive write access to the complete `$RESOURCE` folder, files and subdirectories.","permissions":["write-all","scope-resource-recursive"]},"allow-runtime-meta":{"identifier":"allow-runtime-meta","description":"This allows non-recursive read access to metadata of the `$RUNTIME` folder, including file listing and statistics.","permissions":["read-meta","scope-runtime-index"]},"allow-runtime-meta-recursive":{"identifier":"allow-runtime-meta-recursive","description":"This allows full recursive read access to metadata of the `$RUNTIME` folder, including file listing and statistics.","permissions":["read-meta","scope-runtime-recursive"]},"allow-runtime-read":{"identifier":"allow-runtime-read","description":"This allows non-recursive read access to the `$RUNTIME` folder.","permissions":["read-all","scope-runtime"]},"allow-runtime-read-recursive":{"identifier":"allow-runtime-read-recursive","description":"This allows full recursive read access to the complete `$RUNTIME` folder, files and subdirectories.","permissions":["read-all","scope-runtime-recursive"]},"allow-runtime-write":{"identifier":"allow-runtime-write","description":"This allows non-recursive write access to the `$RUNTIME` folder.","permissions":["write-all","scope-runtime"]},"allow-runtime-write-recursive":{"identifier":"allow-runtime-write-recursive","description":"This allows full recursive write access to the complete `$RUNTIME` folder, files and subdirectories.","permissions":["write-all","scope-runtime-recursive"]},"allow-temp-meta":{"identifier":"allow-temp-meta","description":"This allows non-recursive read access to metadata of the `$TEMP` folder, including file listing and statistics.","permissions":["read-meta","scope-temp-index"]},"allow-temp-meta-recursive":{"identifier":"allow-temp-meta-recursive","description":"This allows full recursive read access to metadata of the `$TEMP` folder, including file listing and statistics.","permissions":["read-meta","scope-temp-recursive"]},"allow-temp-read":{"identifier":"allow-temp-read","description":"This allows non-recursive read access to the `$TEMP` folder.","permissions":["read-all","scope-temp"]},"allow-temp-read-recursive":{"identifier":"allow-temp-read-recursive","description":"This allows full recursive read access to the complete `$TEMP` folder, files and subdirectories.","permissions":["read-all","scope-temp-recursive"]},"allow-temp-write":{"identifier":"allow-temp-write","description":"This allows non-recursive write access to the `$TEMP` folder.","permissions":["write-all","scope-temp"]},"allow-temp-write-recursive":{"identifier":"allow-temp-write-recursive","description":"This allows full recursive write access to the complete `$TEMP` folder, files and subdirectories.","permissions":["write-all","scope-temp-recursive"]},"allow-template-meta":{"identifier":"allow-template-meta","description":"This allows non-recursive read access to metadata of the `$TEMPLATE` folder, including file listing and statistics.","permissions":["read-meta","scope-template-index"]},"allow-template-meta-recursive":{"identifier":"allow-template-meta-recursive","description":"This allows full recursive read access to metadata of the `$TEMPLATE` folder, including file listing and statistics.","permissions":["read-meta","scope-template-recursive"]},"allow-template-read":{"identifier":"allow-template-read","description":"This allows non-recursive read access to the `$TEMPLATE` folder.","permissions":["read-all","scope-template"]},"allow-template-read-recursive":{"identifier":"allow-template-read-recursive","description":"This allows full recursive read access to the complete `$TEMPLATE` folder, files and subdirectories.","permissions":["read-all","scope-template-recursive"]},"allow-template-write":{"identifier":"allow-template-write","description":"This allows non-recursive write access to the `$TEMPLATE` folder.","permissions":["write-all","scope-template"]},"allow-template-write-recursive":{"identifier":"allow-template-write-recursive","description":"This allows full recursive write access to the complete `$TEMPLATE` folder, files and subdirectories.","permissions":["write-all","scope-template-recursive"]},"allow-video-meta":{"identifier":"allow-video-meta","description":"This allows non-recursive read access to metadata of the `$VIDEO` folder, including file listing and statistics.","permissions":["read-meta","scope-video-index"]},"allow-video-meta-recursive":{"identifier":"allow-video-meta-recursive","description":"This allows full recursive read access to metadata of the `$VIDEO` folder, including file listing and statistics.","permissions":["read-meta","scope-video-recursive"]},"allow-video-read":{"identifier":"allow-video-read","description":"This allows non-recursive read access to the `$VIDEO` folder.","permissions":["read-all","scope-video"]},"allow-video-read-recursive":{"identifier":"allow-video-read-recursive","description":"This allows full recursive read access to the complete `$VIDEO` folder, files and subdirectories.","permissions":["read-all","scope-video-recursive"]},"allow-video-write":{"identifier":"allow-video-write","description":"This allows non-recursive write access to the `$VIDEO` folder.","permissions":["write-all","scope-video"]},"allow-video-write-recursive":{"identifier":"allow-video-write-recursive","description":"This allows full recursive write access to the complete `$VIDEO` folder, files and subdirectories.","permissions":["write-all","scope-video-recursive"]},"deny-default":{"identifier":"deny-default","description":"This denies access to dangerous Tauri relevant files and folders by default.","permissions":["deny-webview-data-linux","deny-webview-data-windows"]}},"global_scope_schema":{"$schema":"http://json-schema.org/draft-07/schema#","anyOf":[{"description":"FS scope path.","type":"string"},{"properties":{"path":{"description":"FS scope path.","type":"string"}},"required":["path"],"type":"object"}],"description":"FS scope entry.","title":"FsScopeEntry"}},"global-shortcut":{"default_permission":{"identifier":"default","description":"No features are enabled by default, as we believe\nthe shortcuts can be inherently dangerous and it is\napplication specific if specific shortcuts should be\nregistered or unregistered.\n","permissions":[]},"permissions":{"allow-is-registered":{"identifier":"allow-is-registered","description":"Enables the is_registered command without any pre-configured scope.","commands":{"allow":["is_registered"],"deny":[]}},"allow-register":{"identifier":"allow-register","description":"Enables the register command without any pre-configured scope.","commands":{"allow":["register"],"deny":[]}},"allow-register-all":{"identifier":"allow-register-all","description":"Enables the register_all command without any pre-configured scope.","commands":{"allow":["register_all"],"deny":[]}},"allow-unregister":{"identifier":"allow-unregister","description":"Enables the unregister command without any pre-configured scope.","commands":{"allow":["unregister"],"deny":[]}},"allow-unregister-all":{"identifier":"allow-unregister-all","description":"Enables the unregister_all command without any pre-configured scope.","commands":{"allow":["unregister_all"],"deny":[]}},"deny-is-registered":{"identifier":"deny-is-registered","description":"Denies the is_registered command without any pre-configured scope.","commands":{"allow":[],"deny":["is_registered"]}},"deny-register":{"identifier":"deny-register","description":"Denies the register command without any pre-configured scope.","commands":{"allow":[],"deny":["register"]}},"deny-register-all":{"identifier":"deny-register-all","description":"Denies the register_all command without any pre-configured scope.","commands":{"allow":[],"deny":["register_all"]}},"deny-unregister":{"identifier":"deny-unregister","description":"Denies the unregister command without any pre-configured scope.","commands":{"allow":[],"deny":["unregister"]}},"deny-unregister-all":{"identifier":"deny-unregister-all","description":"Denies the unregister_all command without any pre-configured scope.","commands":{"allow":[],"deny":["unregister_all"]}}},"permission_sets":{},"global_scope_schema":null},"notification":{"default_permission":{"identifier":"default","description":"This permission set configures which\nnotification features are by default exposed.\n\n#### Granted Permissions\n\nIt allows all notification related features.\n\n","permissions":["allow-is-permission-granted","allow-request-permission","allow-notify","allow-register-action-types","allow-register-listener","allow-cancel","allow-get-pending","allow-remove-active","allow-get-active","allow-check-permissions","allow-show","allow-batch","allow-list-channels","allow-delete-channel","allow-create-channel","allow-permission-state"]},"permissions":{"allow-batch":{"identifier":"allow-batch","description":"Enables the batch command without any pre-configured scope.","commands":{"allow":["batch"],"deny":[]}},"allow-cancel":{"identifier":"allow-cancel","description":"Enables the cancel command without any pre-configured scope.","commands":{"allow":["cancel"],"deny":[]}},"allow-check-permissions":{"identifier":"allow-check-permissions","description":"Enables the check_permissions command without any pre-configured scope.","commands":{"allow":["check_permissions"],"deny":[]}},"allow-create-channel":{"identifier":"allow-create-channel","description":"Enables the create_channel command without any pre-configured scope.","commands":{"allow":["create_channel"],"deny":[]}},"allow-delete-channel":{"identifier":"allow-delete-channel","description":"Enables the delete_channel command without any pre-configured scope.","commands":{"allow":["delete_channel"],"deny":[]}},"allow-get-active":{"identifier":"allow-get-active","description":"Enables the get_active command without any pre-configured scope.","commands":{"allow":["get_active"],"deny":[]}},"allow-get-pending":{"identifier":"allow-get-pending","description":"Enables the get_pending command without any pre-configured scope.","commands":{"allow":["get_pending"],"deny":[]}},"allow-is-permission-granted":{"identifier":"allow-is-permission-granted","description":"Enables the is_permission_granted command without any pre-configured scope.","commands":{"allow":["is_permission_granted"],"deny":[]}},"allow-list-channels":{"identifier":"allow-list-channels","description":"Enables the list_channels command without any pre-configured scope.","commands":{"allow":["list_channels"],"deny":[]}},"allow-notify":{"identifier":"allow-notify","description":"Enables the notify command without any pre-configured scope.","commands":{"allow":["notify"],"deny":[]}},"allow-permission-state":{"identifier":"allow-permission-state","description":"Enables the permission_state command without any pre-configured scope.","commands":{"allow":["permission_state"],"deny":[]}},"allow-register-action-types":{"identifier":"allow-register-action-types","description":"Enables the register_action_types command without any pre-configured scope.","commands":{"allow":["register_action_types"],"deny":[]}},"allow-register-listener":{"identifier":"allow-register-listener","description":"Enables the register_listener command without any pre-configured scope.","commands":{"allow":["register_listener"],"deny":[]}},"allow-remove-active":{"identifier":"allow-remove-active","description":"Enables the remove_active command without any pre-configured scope.","commands":{"allow":["remove_active"],"deny":[]}},"allow-request-permission":{"identifier":"allow-request-permission","description":"Enables the request_permission command without any pre-configured scope.","commands":{"allow":["request_permission"],"deny":[]}},"allow-show":{"identifier":"allow-show","description":"Enables the show command without any pre-configured scope.","commands":{"allow":["show"],"deny":[]}},"deny-batch":{"identifier":"deny-batch","description":"Denies the batch command without any pre-configured scope.","commands":{"allow":[],"deny":["batch"]}},"deny-cancel":{"identifier":"deny-cancel","description":"Denies the cancel command without any pre-configured scope.","commands":{"allow":[],"deny":["cancel"]}},"deny-check-permissions":{"identifier":"deny-check-permissions","description":"Denies the check_permissions command without any pre-configured scope.","commands":{"allow":[],"deny":["check_permissions"]}},"deny-create-channel":{"identifier":"deny-create-channel","description":"Denies the create_channel command without any pre-configured scope.","commands":{"allow":[],"deny":["create_channel"]}},"deny-delete-channel":{"identifier":"deny-delete-channel","description":"Denies the delete_channel command without any pre-configured scope.","commands":{"allow":[],"deny":["delete_channel"]}},"deny-get-active":{"identifier":"deny-get-active","description":"Denies the get_active command without any pre-configured scope.","commands":{"allow":[],"deny":["get_active"]}},"deny-get-pending":{"identifier":"deny-get-pending","description":"Denies the get_pending command without any pre-configured scope.","commands":{"allow":[],"deny":["get_pending"]}},"deny-is-permission-granted":{"identifier":"deny-is-permission-granted","description":"Denies the is_permission_granted command without any pre-configured scope.","commands":{"allow":[],"deny":["is_permission_granted"]}},"deny-list-channels":{"identifier":"deny-list-channels","description":"Denies the list_channels command without any pre-configured scope.","commands":{"allow":[],"deny":["list_channels"]}},"deny-notify":{"identifier":"deny-notify","description":"Denies the notify command without any pre-configured scope.","commands":{"allow":[],"deny":["notify"]}},"deny-permission-state":{"identifier":"deny-permission-state","description":"Denies the permission_state command without any pre-configured scope.","commands":{"allow":[],"deny":["permission_state"]}},"deny-register-action-types":{"identifier":"deny-register-action-types","description":"Denies the register_action_types command without any pre-configured scope.","commands":{"allow":[],"deny":["register_action_types"]}},"deny-register-listener":{"identifier":"deny-register-listener","description":"Denies the register_listener command without any pre-configured scope.","commands":{"allow":[],"deny":["register_listener"]}},"deny-remove-active":{"identifier":"deny-remove-active","description":"Denies the remove_active command without any pre-configured scope.","commands":{"allow":[],"deny":["remove_active"]}},"deny-request-permission":{"identifier":"deny-request-permission","description":"Denies the request_permission command without any pre-configured scope.","commands":{"allow":[],"deny":["request_permission"]}},"deny-show":{"identifier":"deny-show","description":"Denies the show command without any pre-configured scope.","commands":{"allow":[],"deny":["show"]}}},"permission_sets":{},"global_scope_schema":null},"os":{"default_permission":{"identifier":"default","description":"This permission set configures which\noperating system information are available\nto gather from the frontend.\n\n#### Granted Permissions\n\nAll information except the host name are available.\n\n","permissions":["allow-arch","allow-exe-extension","allow-family","allow-locale","allow-os-type","allow-platform","allow-version"]},"permissions":{"allow-arch":{"identifier":"allow-arch","description":"Enables the arch command without any pre-configured scope.","commands":{"allow":["arch"],"deny":[]}},"allow-exe-extension":{"identifier":"allow-exe-extension","description":"Enables the exe_extension command without any pre-configured scope.","commands":{"allow":["exe_extension"],"deny":[]}},"allow-family":{"identifier":"allow-family","description":"Enables the family command without any pre-configured scope.","commands":{"allow":["family"],"deny":[]}},"allow-hostname":{"identifier":"allow-hostname","description":"Enables the hostname command without any pre-configured scope.","commands":{"allow":["hostname"],"deny":[]}},"allow-locale":{"identifier":"allow-locale","description":"Enables the locale command without any pre-configured scope.","commands":{"allow":["locale"],"deny":[]}},"allow-os-type":{"identifier":"allow-os-type","description":"Enables the os_type command without any pre-configured scope.","commands":{"allow":["os_type"],"deny":[]}},"allow-platform":{"identifier":"allow-platform","description":"Enables the platform command without any pre-configured scope.","commands":{"allow":["platform"],"deny":[]}},"allow-version":{"identifier":"allow-version","description":"Enables the version command without any pre-configured scope.","commands":{"allow":["version"],"deny":[]}},"deny-arch":{"identifier":"deny-arch","description":"Denies the arch command without any pre-configured scope.","commands":{"allow":[],"deny":["arch"]}},"deny-exe-extension":{"identifier":"deny-exe-extension","description":"Denies the exe_extension command without any pre-configured scope.","commands":{"allow":[],"deny":["exe_extension"]}},"deny-family":{"identifier":"deny-family","description":"Denies the family command without any pre-configured scope.","commands":{"allow":[],"deny":["family"]}},"deny-hostname":{"identifier":"deny-hostname","description":"Denies the hostname command without any pre-configured scope.","commands":{"allow":[],"deny":["hostname"]}},"deny-locale":{"identifier":"deny-locale","description":"Denies the locale command without any pre-configured scope.","commands":{"allow":[],"deny":["locale"]}},"deny-os-type":{"identifier":"deny-os-type","description":"Denies the os_type command without any pre-configured scope.","commands":{"allow":[],"deny":["os_type"]}},"deny-platform":{"identifier":"deny-platform","description":"Denies the platform command without any pre-configured scope.","commands":{"allow":[],"deny":["platform"]}},"deny-version":{"identifier":"deny-version","description":"Denies the version command without any pre-configured scope.","commands":{"allow":[],"deny":["version"]}}},"permission_sets":{},"global_scope_schema":null},"process":{"default_permission":{"identifier":"default","description":"This permission set configures which\nprocess feeatures are by default exposed.\n\n#### Granted Permissions\n\nThis enables to quit via `allow-exit` and restart via `allow-restart`\nthe application.\n","permissions":["allow-exit","allow-restart"]},"permissions":{"allow-exit":{"identifier":"allow-exit","description":"Enables the exit command without any pre-configured scope.","commands":{"allow":["exit"],"deny":[]}},"allow-restart":{"identifier":"allow-restart","description":"Enables the restart command without any pre-configured scope.","commands":{"allow":["restart"],"deny":[]}},"deny-exit":{"identifier":"deny-exit","description":"Denies the exit command without any pre-configured scope.","commands":{"allow":[],"deny":["exit"]}},"deny-restart":{"identifier":"deny-restart","description":"Denies the restart command without any pre-configured scope.","commands":{"allow":[],"deny":["restart"]}}},"permission_sets":{},"global_scope_schema":null},"shell":{"default_permission":{"identifier":"default","description":"This permission set configures which\nshell functionality is exposed by default.\n\n#### Granted Permissions\n\nIt allows to use the `open` functionality without any specific\nscope pre-configured. It will allow opening `http(s)://`,\n`tel:` and `mailto:` links.\n","permissions":["allow-open"]},"permissions":{"allow-execute":{"identifier":"allow-execute","description":"Enables the execute command without any pre-configured scope.","commands":{"allow":["execute"],"deny":[]}},"allow-kill":{"identifier":"allow-kill","description":"Enables the kill command without any pre-configured scope.","commands":{"allow":["kill"],"deny":[]}},"allow-open":{"identifier":"allow-open","description":"Enables the open command without any pre-configured scope.","commands":{"allow":["open"],"deny":[]}},"allow-spawn":{"identifier":"allow-spawn","description":"Enables the spawn command without any pre-configured scope.","commands":{"allow":["spawn"],"deny":[]}},"allow-stdin-write":{"identifier":"allow-stdin-write","description":"Enables the stdin_write command without any pre-configured scope.","commands":{"allow":["stdin_write"],"deny":[]}},"deny-execute":{"identifier":"deny-execute","description":"Denies the execute command without any pre-configured scope.","commands":{"allow":[],"deny":["execute"]}},"deny-kill":{"identifier":"deny-kill","description":"Denies the kill command without any pre-configured scope.","commands":{"allow":[],"deny":["kill"]}},"deny-open":{"identifier":"deny-open","description":"Denies the open command without any pre-configured scope.","commands":{"allow":[],"deny":["open"]}},"deny-spawn":{"identifier":"deny-spawn","description":"Denies the spawn command without any pre-configured scope.","commands":{"allow":[],"deny":["spawn"]}},"deny-stdin-write":{"identifier":"deny-stdin-write","description":"Denies the stdin_write command without any pre-configured scope.","commands":{"allow":[],"deny":["stdin_write"]}}},"permission_sets":{},"global_scope_schema":{"$schema":"http://json-schema.org/draft-07/schema#","definitions":{"ShellAllowedArg":{"anyOf":[{"description":"A non-configurable argument that is passed to the command in the order it was specified.","type":"string"},{"additionalProperties":false,"description":"A variable that is set while calling the command from the webview API.","properties":{"raw":{"default":false,"description":"Marks the validator as a raw regex, meaning the plugin should not make any modification at runtime.\n\nThis means the regex will not match on the entire string by default, which might be exploited if your regex allow unexpected input to be considered valid. When using this option, make sure your regex is correct.","type":"boolean"},"validator":{"description":"[regex] validator to require passed values to conform to an expected input.\n\nThis will require the argument value passed to this variable to match the `validator` regex before it will be executed.\n\nThe regex string is by default surrounded by `^...$` to match the full string. For example the `https?://\\w+` regex would be registered as `^https?://\\w+$`.\n\n[regex]: ","type":"string"}},"required":["validator"],"type":"object"}],"description":"A command argument allowed to be executed by the webview API."},"ShellAllowedArgs":{"anyOf":[{"description":"Use a simple boolean to allow all or disable all arguments to this command configuration.","type":"boolean"},{"description":"A specific set of [`ShellAllowedArg`] that are valid to call for the command configuration.","items":{"$ref":"#/definitions/ShellAllowedArg"},"type":"array"}],"description":"A set of command arguments allowed to be executed by the webview API.\n\nA value of `true` will allow any arguments to be passed to the command. `false` will disable all arguments. A list of [`ShellAllowedArg`] will set those arguments as the only valid arguments to be passed to the attached command configuration."}},"description":"A command allowed to be executed by the webview API.","properties":{"args":{"allOf":[{"$ref":"#/definitions/ShellAllowedArgs"}],"description":"The allowed arguments for the command execution."},"cmd":{"description":"The command name. It can start with a variable that resolves to a system base directory. The variables are: `$AUDIO`, `$CACHE`, `$CONFIG`, `$DATA`, `$LOCALDATA`, `$DESKTOP`, `$DOCUMENT`, `$DOWNLOAD`, `$EXE`, `$FONT`, `$HOME`, `$PICTURE`, `$PUBLIC`, `$RUNTIME`, `$TEMPLATE`, `$VIDEO`, `$RESOURCE`, `$APP`, `$LOG`, `$TEMP`, `$APPCONFIG`, `$APPDATA`, `$APPLOCALDATA`, `$APPCACHE`, `$APPLOG`.","type":"string"},"name":{"description":"The name for this allowed shell command configuration.\n\nThis name will be used inside of the webview API to call this command along with any specified arguments.","type":"string"},"sidecar":{"description":"If this command is a sidecar command.","type":"boolean"}},"required":["args","cmd","name","sidecar"],"title":"Entry","type":"object"}},"updater":{"default_permission":{"identifier":"default","description":"This permission set configures which kind of\nupdater functions are exposed to the frontend.\n\n#### Granted Permissions\n\nThe full workflow from checking for updates to installing them\nis enabled.\n\n","permissions":["allow-check","allow-download","allow-install","allow-download-and-install"]},"permissions":{"allow-check":{"identifier":"allow-check","description":"Enables the check command without any pre-configured scope.","commands":{"allow":["check"],"deny":[]}},"allow-download":{"identifier":"allow-download","description":"Enables the download command without any pre-configured scope.","commands":{"allow":["download"],"deny":[]}},"allow-download-and-install":{"identifier":"allow-download-and-install","description":"Enables the download_and_install command without any pre-configured scope.","commands":{"allow":["download_and_install"],"deny":[]}},"allow-install":{"identifier":"allow-install","description":"Enables the install command without any pre-configured scope.","commands":{"allow":["install"],"deny":[]}},"deny-check":{"identifier":"deny-check","description":"Denies the check command without any pre-configured scope.","commands":{"allow":[],"deny":["check"]}},"deny-download":{"identifier":"deny-download","description":"Denies the download command without any pre-configured scope.","commands":{"allow":[],"deny":["download"]}},"deny-download-and-install":{"identifier":"deny-download-and-install","description":"Denies the download_and_install command without any pre-configured scope.","commands":{"allow":[],"deny":["download_and_install"]}},"deny-install":{"identifier":"deny-install","description":"Denies the install command without any pre-configured scope.","commands":{"allow":[],"deny":["install"]}}},"permission_sets":{},"global_scope_schema":null}} \ No newline at end of file diff --git a/clash-nyanpasu/backend/tauri/gen/schemas/capabilities.json b/clash-nyanpasu/backend/tauri/gen/schemas/capabilities.json new file mode 100644 index 0000000000..fe7b475f6b --- /dev/null +++ b/clash-nyanpasu/backend/tauri/gen/schemas/capabilities.json @@ -0,0 +1 @@ +{"migrated":{"identifier":"migrated","description":"permissions that were migrated from v1","local":true,"windows":["main"],"permissions":["core:default","fs:allow-read-file","fs:allow-write-file","fs:allow-read-dir","fs:allow-copy-file","fs:allow-mkdir","fs:allow-remove","fs:allow-remove","fs:allow-rename","fs:allow-exists","core:window:allow-create","core:window:allow-center","core:window:allow-request-user-attention","core:window:allow-set-resizable","core:window:allow-set-maximizable","core:window:allow-set-minimizable","core:window:allow-set-closable","core:window:allow-set-title","core:window:allow-maximize","core:window:allow-unmaximize","core:window:allow-minimize","core:window:allow-unminimize","core:window:allow-show","core:window:allow-hide","core:window:allow-close","core:window:allow-set-decorations","core:window:allow-set-always-on-top","core:window:allow-set-content-protected","core:window:allow-set-size","core:window:allow-set-min-size","core:window:allow-set-max-size","core:window:allow-set-position","core:window:allow-set-fullscreen","core:window:allow-set-focus","core:window:allow-set-icon","core:window:allow-set-skip-taskbar","core:window:allow-set-cursor-grab","core:window:allow-set-cursor-visible","core:window:allow-set-cursor-icon","core:window:allow-set-cursor-position","core:window:allow-set-ignore-cursor-events","core:window:allow-start-dragging","core:webview:allow-print","shell:allow-execute","shell:allow-open","dialog:allow-open","dialog:allow-save","dialog:allow-message","dialog:allow-ask","dialog:allow-confirm","notification:default","global-shortcut:allow-is-registered","global-shortcut:allow-register","global-shortcut:allow-register-all","global-shortcut:allow-unregister","global-shortcut:allow-unregister-all","os:allow-platform","os:allow-version","os:allow-os-type","os:allow-family","os:allow-arch","os:allow-exe-extension","os:allow-locale","os:allow-hostname","process:allow-restart","process:allow-exit","clipboard-manager:allow-read-text","clipboard-manager:allow-write-text"]}} \ No newline at end of file diff --git a/clash-nyanpasu/backend/tauri/gen/schemas/desktop-schema.json b/clash-nyanpasu/backend/tauri/gen/schemas/desktop-schema.json new file mode 100644 index 0000000000..3fe03ed0f2 --- /dev/null +++ b/clash-nyanpasu/backend/tauri/gen/schemas/desktop-schema.json @@ -0,0 +1,7244 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "CapabilityFile", + "description": "Capability formats accepted in a capability file.", + "anyOf": [ + { + "description": "A single capability.", + "allOf": [ + { + "$ref": "#/definitions/Capability" + } + ] + }, + { + "description": "A list of capabilities.", + "type": "array", + "items": { + "$ref": "#/definitions/Capability" + } + }, + { + "description": "A list of capabilities.", + "type": "object", + "required": [ + "capabilities" + ], + "properties": { + "capabilities": { + "description": "The list of capabilities.", + "type": "array", + "items": { + "$ref": "#/definitions/Capability" + } + } + } + } + ], + "definitions": { + "Capability": { + "description": "A grouping and boundary mechanism developers can use to isolate access to the IPC layer.\n\nIt controls application windows fine grained access to the Tauri core, application, or plugin commands. If a window is not matching any capability then it has no access to the IPC layer at all.\n\nThis can be done to create groups of windows, based on their required system access, which can reduce impact of frontend vulnerabilities in less privileged windows. Windows can be added to a capability by exact name (e.g. `main-window`) or glob patterns like `*` or `admin-*`. A Window can have none, one, or multiple associated capabilities.\n\n## Example\n\n```json { \"identifier\": \"main-user-files-write\", \"description\": \"This capability allows the `main` window on macOS and Windows access to `filesystem` write related commands and `dialog` commands to enable programatic access to files selected by the user.\", \"windows\": [ \"main\" ], \"permissions\": [ \"core:default\", \"dialog:open\", { \"identifier\": \"fs:allow-write-text-file\", \"allow\": [{ \"path\": \"$HOME/test.txt\" }] }, \"platforms\": [\"macOS\",\"windows\"] } ```", + "type": "object", + "required": [ + "identifier", + "permissions" + ], + "properties": { + "identifier": { + "description": "Identifier of the capability.\n\n## Example\n\n`main-user-files-write`", + "type": "string" + }, + "description": { + "description": "Description of what the capability is intended to allow on associated windows.\n\nIt should contain a description of what the grouped permissions should allow.\n\n## Example\n\nThis capability allows the `main` window access to `filesystem` write related commands and `dialog` commands to enable programatic access to files selected by the user.", + "default": "", + "type": "string" + }, + "remote": { + "description": "Configure remote URLs that can use the capability permissions.\n\nThis setting is optional and defaults to not being set, as our default use case is that the content is served from our local application.\n\n:::caution Make sure you understand the security implications of providing remote sources with local system access. :::\n\n## Example\n\n```json { \"urls\": [\"https://*.mydomain.dev\"] } ```", + "anyOf": [ + { + "$ref": "#/definitions/CapabilityRemote" + }, + { + "type": "null" + } + ] + }, + "local": { + "description": "Whether this capability is enabled for local app URLs or not. Defaults to `true`.", + "default": true, + "type": "boolean" + }, + "windows": { + "description": "List of windows that are affected by this capability. Can be a glob pattern.\n\nOn multiwebview windows, prefer [`Self::webviews`] for a fine grained access control.\n\n## Example\n\n`[\"main\"]`", + "type": "array", + "items": { + "type": "string" + } + }, + "webviews": { + "description": "List of webviews that are affected by this capability. Can be a glob pattern.\n\nThis is only required when using on multiwebview contexts, by default all child webviews of a window that matches [`Self::windows`] are linked.\n\n## Example\n\n`[\"sub-webview-one\", \"sub-webview-two\"]`", + "type": "array", + "items": { + "type": "string" + } + }, + "permissions": { + "description": "List of permissions attached to this capability.\n\nMust include the plugin name as prefix in the form of `${plugin-name}:${permission-name}`. For commands directly implemented in the application itself only `${permission-name}` is required.\n\n## Example\n\n```json [ \"core:default\", \"shell:allow-open\", \"dialog:open\", { \"identifier\": \"fs:allow-write-text-file\", \"allow\": [{ \"path\": \"$HOME/test.txt\" }] } ```", + "type": "array", + "items": { + "$ref": "#/definitions/PermissionEntry" + }, + "uniqueItems": true + }, + "platforms": { + "description": "Limit which target platforms this capability applies to.\n\nBy default all platforms are targeted.\n\n## Example\n\n`[\"macOS\",\"windows\"]`", + "type": [ + "array", + "null" + ], + "items": { + "$ref": "#/definitions/Target" + } + } + } + }, + "CapabilityRemote": { + "description": "Configuration for remote URLs that are associated with the capability.", + "type": "object", + "required": [ + "urls" + ], + "properties": { + "urls": { + "description": "Remote domains this capability refers to using the [URLPattern standard](https://urlpattern.spec.whatwg.org/).\n\n## Examples\n\n- \"https://*.mydomain.dev\": allows subdomains of mydomain.dev - \"https://mydomain.dev/api/*\": allows any subpath of mydomain.dev/api", + "type": "array", + "items": { + "type": "string" + } + } + } + }, + "PermissionEntry": { + "description": "An entry for a permission value in a [`Capability`] can be either a raw permission [`Identifier`] or an object that references a permission and extends its scope.", + "anyOf": [ + { + "description": "Reference a permission or permission set by identifier.", + "allOf": [ + { + "$ref": "#/definitions/Identifier" + } + ] + }, + { + "description": "Reference a permission or permission set by identifier and extends its scope.", + "type": "object", + "oneOf": [ + { + "type": "object", + "required": [ + "identifier" + ], + "properties": { + "identifier": { + "oneOf": [ + { + "description": "fs:default -> This set of permissions describes the what kind of\nfile system access the `fs` plugin has enabled or denied by default.\n\n#### Granted Permissions\n\nThis default permission set enables read access to the\napplication specific directories (AppConfig, AppData, AppLocalData, AppCache,\nAppLog) and all files and sub directories created in it.\nThe location of these directories depends on the operating system,\nwhere the application is run.\n\nIn general these directories need to be manually created\nby the application at runtime, before accessing files or folders\nin it is possible.\n\nTherefore, it is also allowed to create all of these folders via\nthe `mkdir` command.\n\n#### Denied Permissions\n\nThis default permission set prevents access to critical components\nof the Tauri application by default.\nOn Windows the webview data folder access is denied.\n\n", + "type": "string", + "enum": [ + "fs:default" + ] + }, + { + "description": "fs:allow-app-meta -> This allows non-recursive read access to metadata of the `$APP` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-app-meta" + ] + }, + { + "description": "fs:allow-app-meta-recursive -> This allows full recursive read access to metadata of the `$APP` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-app-meta-recursive" + ] + }, + { + "description": "fs:allow-app-read -> This allows non-recursive read access to the `$APP` folder.", + "type": "string", + "enum": [ + "fs:allow-app-read" + ] + }, + { + "description": "fs:allow-app-read-recursive -> This allows full recursive read access to the complete `$APP` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-app-read-recursive" + ] + }, + { + "description": "fs:allow-app-write -> This allows non-recursive write access to the `$APP` folder.", + "type": "string", + "enum": [ + "fs:allow-app-write" + ] + }, + { + "description": "fs:allow-app-write-recursive -> This allows full recursive write access to the complete `$APP` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-app-write-recursive" + ] + }, + { + "description": "fs:allow-appcache-meta -> This allows non-recursive read access to metadata of the `$APPCACHE` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-appcache-meta" + ] + }, + { + "description": "fs:allow-appcache-meta-recursive -> This allows full recursive read access to metadata of the `$APPCACHE` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-appcache-meta-recursive" + ] + }, + { + "description": "fs:allow-appcache-read -> This allows non-recursive read access to the `$APPCACHE` folder.", + "type": "string", + "enum": [ + "fs:allow-appcache-read" + ] + }, + { + "description": "fs:allow-appcache-read-recursive -> This allows full recursive read access to the complete `$APPCACHE` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-appcache-read-recursive" + ] + }, + { + "description": "fs:allow-appcache-write -> This allows non-recursive write access to the `$APPCACHE` folder.", + "type": "string", + "enum": [ + "fs:allow-appcache-write" + ] + }, + { + "description": "fs:allow-appcache-write-recursive -> This allows full recursive write access to the complete `$APPCACHE` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-appcache-write-recursive" + ] + }, + { + "description": "fs:allow-appconfig-meta -> This allows non-recursive read access to metadata of the `$APPCONFIG` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-appconfig-meta" + ] + }, + { + "description": "fs:allow-appconfig-meta-recursive -> This allows full recursive read access to metadata of the `$APPCONFIG` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-appconfig-meta-recursive" + ] + }, + { + "description": "fs:allow-appconfig-read -> This allows non-recursive read access to the `$APPCONFIG` folder.", + "type": "string", + "enum": [ + "fs:allow-appconfig-read" + ] + }, + { + "description": "fs:allow-appconfig-read-recursive -> This allows full recursive read access to the complete `$APPCONFIG` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-appconfig-read-recursive" + ] + }, + { + "description": "fs:allow-appconfig-write -> This allows non-recursive write access to the `$APPCONFIG` folder.", + "type": "string", + "enum": [ + "fs:allow-appconfig-write" + ] + }, + { + "description": "fs:allow-appconfig-write-recursive -> This allows full recursive write access to the complete `$APPCONFIG` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-appconfig-write-recursive" + ] + }, + { + "description": "fs:allow-appdata-meta -> This allows non-recursive read access to metadata of the `$APPDATA` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-appdata-meta" + ] + }, + { + "description": "fs:allow-appdata-meta-recursive -> This allows full recursive read access to metadata of the `$APPDATA` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-appdata-meta-recursive" + ] + }, + { + "description": "fs:allow-appdata-read -> This allows non-recursive read access to the `$APPDATA` folder.", + "type": "string", + "enum": [ + "fs:allow-appdata-read" + ] + }, + { + "description": "fs:allow-appdata-read-recursive -> This allows full recursive read access to the complete `$APPDATA` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-appdata-read-recursive" + ] + }, + { + "description": "fs:allow-appdata-write -> This allows non-recursive write access to the `$APPDATA` folder.", + "type": "string", + "enum": [ + "fs:allow-appdata-write" + ] + }, + { + "description": "fs:allow-appdata-write-recursive -> This allows full recursive write access to the complete `$APPDATA` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-appdata-write-recursive" + ] + }, + { + "description": "fs:allow-applocaldata-meta -> This allows non-recursive read access to metadata of the `$APPLOCALDATA` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-applocaldata-meta" + ] + }, + { + "description": "fs:allow-applocaldata-meta-recursive -> This allows full recursive read access to metadata of the `$APPLOCALDATA` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-applocaldata-meta-recursive" + ] + }, + { + "description": "fs:allow-applocaldata-read -> This allows non-recursive read access to the `$APPLOCALDATA` folder.", + "type": "string", + "enum": [ + "fs:allow-applocaldata-read" + ] + }, + { + "description": "fs:allow-applocaldata-read-recursive -> This allows full recursive read access to the complete `$APPLOCALDATA` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-applocaldata-read-recursive" + ] + }, + { + "description": "fs:allow-applocaldata-write -> This allows non-recursive write access to the `$APPLOCALDATA` folder.", + "type": "string", + "enum": [ + "fs:allow-applocaldata-write" + ] + }, + { + "description": "fs:allow-applocaldata-write-recursive -> This allows full recursive write access to the complete `$APPLOCALDATA` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-applocaldata-write-recursive" + ] + }, + { + "description": "fs:allow-applog-meta -> This allows non-recursive read access to metadata of the `$APPLOG` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-applog-meta" + ] + }, + { + "description": "fs:allow-applog-meta-recursive -> This allows full recursive read access to metadata of the `$APPLOG` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-applog-meta-recursive" + ] + }, + { + "description": "fs:allow-applog-read -> This allows non-recursive read access to the `$APPLOG` folder.", + "type": "string", + "enum": [ + "fs:allow-applog-read" + ] + }, + { + "description": "fs:allow-applog-read-recursive -> This allows full recursive read access to the complete `$APPLOG` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-applog-read-recursive" + ] + }, + { + "description": "fs:allow-applog-write -> This allows non-recursive write access to the `$APPLOG` folder.", + "type": "string", + "enum": [ + "fs:allow-applog-write" + ] + }, + { + "description": "fs:allow-applog-write-recursive -> This allows full recursive write access to the complete `$APPLOG` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-applog-write-recursive" + ] + }, + { + "description": "fs:allow-audio-meta -> This allows non-recursive read access to metadata of the `$AUDIO` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-audio-meta" + ] + }, + { + "description": "fs:allow-audio-meta-recursive -> This allows full recursive read access to metadata of the `$AUDIO` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-audio-meta-recursive" + ] + }, + { + "description": "fs:allow-audio-read -> This allows non-recursive read access to the `$AUDIO` folder.", + "type": "string", + "enum": [ + "fs:allow-audio-read" + ] + }, + { + "description": "fs:allow-audio-read-recursive -> This allows full recursive read access to the complete `$AUDIO` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-audio-read-recursive" + ] + }, + { + "description": "fs:allow-audio-write -> This allows non-recursive write access to the `$AUDIO` folder.", + "type": "string", + "enum": [ + "fs:allow-audio-write" + ] + }, + { + "description": "fs:allow-audio-write-recursive -> This allows full recursive write access to the complete `$AUDIO` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-audio-write-recursive" + ] + }, + { + "description": "fs:allow-cache-meta -> This allows non-recursive read access to metadata of the `$CACHE` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-cache-meta" + ] + }, + { + "description": "fs:allow-cache-meta-recursive -> This allows full recursive read access to metadata of the `$CACHE` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-cache-meta-recursive" + ] + }, + { + "description": "fs:allow-cache-read -> This allows non-recursive read access to the `$CACHE` folder.", + "type": "string", + "enum": [ + "fs:allow-cache-read" + ] + }, + { + "description": "fs:allow-cache-read-recursive -> This allows full recursive read access to the complete `$CACHE` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-cache-read-recursive" + ] + }, + { + "description": "fs:allow-cache-write -> This allows non-recursive write access to the `$CACHE` folder.", + "type": "string", + "enum": [ + "fs:allow-cache-write" + ] + }, + { + "description": "fs:allow-cache-write-recursive -> This allows full recursive write access to the complete `$CACHE` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-cache-write-recursive" + ] + }, + { + "description": "fs:allow-config-meta -> This allows non-recursive read access to metadata of the `$CONFIG` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-config-meta" + ] + }, + { + "description": "fs:allow-config-meta-recursive -> This allows full recursive read access to metadata of the `$CONFIG` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-config-meta-recursive" + ] + }, + { + "description": "fs:allow-config-read -> This allows non-recursive read access to the `$CONFIG` folder.", + "type": "string", + "enum": [ + "fs:allow-config-read" + ] + }, + { + "description": "fs:allow-config-read-recursive -> This allows full recursive read access to the complete `$CONFIG` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-config-read-recursive" + ] + }, + { + "description": "fs:allow-config-write -> This allows non-recursive write access to the `$CONFIG` folder.", + "type": "string", + "enum": [ + "fs:allow-config-write" + ] + }, + { + "description": "fs:allow-config-write-recursive -> This allows full recursive write access to the complete `$CONFIG` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-config-write-recursive" + ] + }, + { + "description": "fs:allow-data-meta -> This allows non-recursive read access to metadata of the `$DATA` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-data-meta" + ] + }, + { + "description": "fs:allow-data-meta-recursive -> This allows full recursive read access to metadata of the `$DATA` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-data-meta-recursive" + ] + }, + { + "description": "fs:allow-data-read -> This allows non-recursive read access to the `$DATA` folder.", + "type": "string", + "enum": [ + "fs:allow-data-read" + ] + }, + { + "description": "fs:allow-data-read-recursive -> This allows full recursive read access to the complete `$DATA` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-data-read-recursive" + ] + }, + { + "description": "fs:allow-data-write -> This allows non-recursive write access to the `$DATA` folder.", + "type": "string", + "enum": [ + "fs:allow-data-write" + ] + }, + { + "description": "fs:allow-data-write-recursive -> This allows full recursive write access to the complete `$DATA` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-data-write-recursive" + ] + }, + { + "description": "fs:allow-desktop-meta -> This allows non-recursive read access to metadata of the `$DESKTOP` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-desktop-meta" + ] + }, + { + "description": "fs:allow-desktop-meta-recursive -> This allows full recursive read access to metadata of the `$DESKTOP` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-desktop-meta-recursive" + ] + }, + { + "description": "fs:allow-desktop-read -> This allows non-recursive read access to the `$DESKTOP` folder.", + "type": "string", + "enum": [ + "fs:allow-desktop-read" + ] + }, + { + "description": "fs:allow-desktop-read-recursive -> This allows full recursive read access to the complete `$DESKTOP` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-desktop-read-recursive" + ] + }, + { + "description": "fs:allow-desktop-write -> This allows non-recursive write access to the `$DESKTOP` folder.", + "type": "string", + "enum": [ + "fs:allow-desktop-write" + ] + }, + { + "description": "fs:allow-desktop-write-recursive -> This allows full recursive write access to the complete `$DESKTOP` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-desktop-write-recursive" + ] + }, + { + "description": "fs:allow-document-meta -> This allows non-recursive read access to metadata of the `$DOCUMENT` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-document-meta" + ] + }, + { + "description": "fs:allow-document-meta-recursive -> This allows full recursive read access to metadata of the `$DOCUMENT` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-document-meta-recursive" + ] + }, + { + "description": "fs:allow-document-read -> This allows non-recursive read access to the `$DOCUMENT` folder.", + "type": "string", + "enum": [ + "fs:allow-document-read" + ] + }, + { + "description": "fs:allow-document-read-recursive -> This allows full recursive read access to the complete `$DOCUMENT` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-document-read-recursive" + ] + }, + { + "description": "fs:allow-document-write -> This allows non-recursive write access to the `$DOCUMENT` folder.", + "type": "string", + "enum": [ + "fs:allow-document-write" + ] + }, + { + "description": "fs:allow-document-write-recursive -> This allows full recursive write access to the complete `$DOCUMENT` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-document-write-recursive" + ] + }, + { + "description": "fs:allow-download-meta -> This allows non-recursive read access to metadata of the `$DOWNLOAD` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-download-meta" + ] + }, + { + "description": "fs:allow-download-meta-recursive -> This allows full recursive read access to metadata of the `$DOWNLOAD` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-download-meta-recursive" + ] + }, + { + "description": "fs:allow-download-read -> This allows non-recursive read access to the `$DOWNLOAD` folder.", + "type": "string", + "enum": [ + "fs:allow-download-read" + ] + }, + { + "description": "fs:allow-download-read-recursive -> This allows full recursive read access to the complete `$DOWNLOAD` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-download-read-recursive" + ] + }, + { + "description": "fs:allow-download-write -> This allows non-recursive write access to the `$DOWNLOAD` folder.", + "type": "string", + "enum": [ + "fs:allow-download-write" + ] + }, + { + "description": "fs:allow-download-write-recursive -> This allows full recursive write access to the complete `$DOWNLOAD` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-download-write-recursive" + ] + }, + { + "description": "fs:allow-exe-meta -> This allows non-recursive read access to metadata of the `$EXE` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-exe-meta" + ] + }, + { + "description": "fs:allow-exe-meta-recursive -> This allows full recursive read access to metadata of the `$EXE` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-exe-meta-recursive" + ] + }, + { + "description": "fs:allow-exe-read -> This allows non-recursive read access to the `$EXE` folder.", + "type": "string", + "enum": [ + "fs:allow-exe-read" + ] + }, + { + "description": "fs:allow-exe-read-recursive -> This allows full recursive read access to the complete `$EXE` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-exe-read-recursive" + ] + }, + { + "description": "fs:allow-exe-write -> This allows non-recursive write access to the `$EXE` folder.", + "type": "string", + "enum": [ + "fs:allow-exe-write" + ] + }, + { + "description": "fs:allow-exe-write-recursive -> This allows full recursive write access to the complete `$EXE` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-exe-write-recursive" + ] + }, + { + "description": "fs:allow-font-meta -> This allows non-recursive read access to metadata of the `$FONT` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-font-meta" + ] + }, + { + "description": "fs:allow-font-meta-recursive -> This allows full recursive read access to metadata of the `$FONT` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-font-meta-recursive" + ] + }, + { + "description": "fs:allow-font-read -> This allows non-recursive read access to the `$FONT` folder.", + "type": "string", + "enum": [ + "fs:allow-font-read" + ] + }, + { + "description": "fs:allow-font-read-recursive -> This allows full recursive read access to the complete `$FONT` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-font-read-recursive" + ] + }, + { + "description": "fs:allow-font-write -> This allows non-recursive write access to the `$FONT` folder.", + "type": "string", + "enum": [ + "fs:allow-font-write" + ] + }, + { + "description": "fs:allow-font-write-recursive -> This allows full recursive write access to the complete `$FONT` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-font-write-recursive" + ] + }, + { + "description": "fs:allow-home-meta -> This allows non-recursive read access to metadata of the `$HOME` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-home-meta" + ] + }, + { + "description": "fs:allow-home-meta-recursive -> This allows full recursive read access to metadata of the `$HOME` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-home-meta-recursive" + ] + }, + { + "description": "fs:allow-home-read -> This allows non-recursive read access to the `$HOME` folder.", + "type": "string", + "enum": [ + "fs:allow-home-read" + ] + }, + { + "description": "fs:allow-home-read-recursive -> This allows full recursive read access to the complete `$HOME` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-home-read-recursive" + ] + }, + { + "description": "fs:allow-home-write -> This allows non-recursive write access to the `$HOME` folder.", + "type": "string", + "enum": [ + "fs:allow-home-write" + ] + }, + { + "description": "fs:allow-home-write-recursive -> This allows full recursive write access to the complete `$HOME` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-home-write-recursive" + ] + }, + { + "description": "fs:allow-localdata-meta -> This allows non-recursive read access to metadata of the `$LOCALDATA` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-localdata-meta" + ] + }, + { + "description": "fs:allow-localdata-meta-recursive -> This allows full recursive read access to metadata of the `$LOCALDATA` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-localdata-meta-recursive" + ] + }, + { + "description": "fs:allow-localdata-read -> This allows non-recursive read access to the `$LOCALDATA` folder.", + "type": "string", + "enum": [ + "fs:allow-localdata-read" + ] + }, + { + "description": "fs:allow-localdata-read-recursive -> This allows full recursive read access to the complete `$LOCALDATA` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-localdata-read-recursive" + ] + }, + { + "description": "fs:allow-localdata-write -> This allows non-recursive write access to the `$LOCALDATA` folder.", + "type": "string", + "enum": [ + "fs:allow-localdata-write" + ] + }, + { + "description": "fs:allow-localdata-write-recursive -> This allows full recursive write access to the complete `$LOCALDATA` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-localdata-write-recursive" + ] + }, + { + "description": "fs:allow-log-meta -> This allows non-recursive read access to metadata of the `$LOG` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-log-meta" + ] + }, + { + "description": "fs:allow-log-meta-recursive -> This allows full recursive read access to metadata of the `$LOG` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-log-meta-recursive" + ] + }, + { + "description": "fs:allow-log-read -> This allows non-recursive read access to the `$LOG` folder.", + "type": "string", + "enum": [ + "fs:allow-log-read" + ] + }, + { + "description": "fs:allow-log-read-recursive -> This allows full recursive read access to the complete `$LOG` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-log-read-recursive" + ] + }, + { + "description": "fs:allow-log-write -> This allows non-recursive write access to the `$LOG` folder.", + "type": "string", + "enum": [ + "fs:allow-log-write" + ] + }, + { + "description": "fs:allow-log-write-recursive -> This allows full recursive write access to the complete `$LOG` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-log-write-recursive" + ] + }, + { + "description": "fs:allow-picture-meta -> This allows non-recursive read access to metadata of the `$PICTURE` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-picture-meta" + ] + }, + { + "description": "fs:allow-picture-meta-recursive -> This allows full recursive read access to metadata of the `$PICTURE` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-picture-meta-recursive" + ] + }, + { + "description": "fs:allow-picture-read -> This allows non-recursive read access to the `$PICTURE` folder.", + "type": "string", + "enum": [ + "fs:allow-picture-read" + ] + }, + { + "description": "fs:allow-picture-read-recursive -> This allows full recursive read access to the complete `$PICTURE` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-picture-read-recursive" + ] + }, + { + "description": "fs:allow-picture-write -> This allows non-recursive write access to the `$PICTURE` folder.", + "type": "string", + "enum": [ + "fs:allow-picture-write" + ] + }, + { + "description": "fs:allow-picture-write-recursive -> This allows full recursive write access to the complete `$PICTURE` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-picture-write-recursive" + ] + }, + { + "description": "fs:allow-public-meta -> This allows non-recursive read access to metadata of the `$PUBLIC` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-public-meta" + ] + }, + { + "description": "fs:allow-public-meta-recursive -> This allows full recursive read access to metadata of the `$PUBLIC` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-public-meta-recursive" + ] + }, + { + "description": "fs:allow-public-read -> This allows non-recursive read access to the `$PUBLIC` folder.", + "type": "string", + "enum": [ + "fs:allow-public-read" + ] + }, + { + "description": "fs:allow-public-read-recursive -> This allows full recursive read access to the complete `$PUBLIC` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-public-read-recursive" + ] + }, + { + "description": "fs:allow-public-write -> This allows non-recursive write access to the `$PUBLIC` folder.", + "type": "string", + "enum": [ + "fs:allow-public-write" + ] + }, + { + "description": "fs:allow-public-write-recursive -> This allows full recursive write access to the complete `$PUBLIC` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-public-write-recursive" + ] + }, + { + "description": "fs:allow-resource-meta -> This allows non-recursive read access to metadata of the `$RESOURCE` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-resource-meta" + ] + }, + { + "description": "fs:allow-resource-meta-recursive -> This allows full recursive read access to metadata of the `$RESOURCE` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-resource-meta-recursive" + ] + }, + { + "description": "fs:allow-resource-read -> This allows non-recursive read access to the `$RESOURCE` folder.", + "type": "string", + "enum": [ + "fs:allow-resource-read" + ] + }, + { + "description": "fs:allow-resource-read-recursive -> This allows full recursive read access to the complete `$RESOURCE` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-resource-read-recursive" + ] + }, + { + "description": "fs:allow-resource-write -> This allows non-recursive write access to the `$RESOURCE` folder.", + "type": "string", + "enum": [ + "fs:allow-resource-write" + ] + }, + { + "description": "fs:allow-resource-write-recursive -> This allows full recursive write access to the complete `$RESOURCE` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-resource-write-recursive" + ] + }, + { + "description": "fs:allow-runtime-meta -> This allows non-recursive read access to metadata of the `$RUNTIME` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-runtime-meta" + ] + }, + { + "description": "fs:allow-runtime-meta-recursive -> This allows full recursive read access to metadata of the `$RUNTIME` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-runtime-meta-recursive" + ] + }, + { + "description": "fs:allow-runtime-read -> This allows non-recursive read access to the `$RUNTIME` folder.", + "type": "string", + "enum": [ + "fs:allow-runtime-read" + ] + }, + { + "description": "fs:allow-runtime-read-recursive -> This allows full recursive read access to the complete `$RUNTIME` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-runtime-read-recursive" + ] + }, + { + "description": "fs:allow-runtime-write -> This allows non-recursive write access to the `$RUNTIME` folder.", + "type": "string", + "enum": [ + "fs:allow-runtime-write" + ] + }, + { + "description": "fs:allow-runtime-write-recursive -> This allows full recursive write access to the complete `$RUNTIME` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-runtime-write-recursive" + ] + }, + { + "description": "fs:allow-temp-meta -> This allows non-recursive read access to metadata of the `$TEMP` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-temp-meta" + ] + }, + { + "description": "fs:allow-temp-meta-recursive -> This allows full recursive read access to metadata of the `$TEMP` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-temp-meta-recursive" + ] + }, + { + "description": "fs:allow-temp-read -> This allows non-recursive read access to the `$TEMP` folder.", + "type": "string", + "enum": [ + "fs:allow-temp-read" + ] + }, + { + "description": "fs:allow-temp-read-recursive -> This allows full recursive read access to the complete `$TEMP` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-temp-read-recursive" + ] + }, + { + "description": "fs:allow-temp-write -> This allows non-recursive write access to the `$TEMP` folder.", + "type": "string", + "enum": [ + "fs:allow-temp-write" + ] + }, + { + "description": "fs:allow-temp-write-recursive -> This allows full recursive write access to the complete `$TEMP` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-temp-write-recursive" + ] + }, + { + "description": "fs:allow-template-meta -> This allows non-recursive read access to metadata of the `$TEMPLATE` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-template-meta" + ] + }, + { + "description": "fs:allow-template-meta-recursive -> This allows full recursive read access to metadata of the `$TEMPLATE` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-template-meta-recursive" + ] + }, + { + "description": "fs:allow-template-read -> This allows non-recursive read access to the `$TEMPLATE` folder.", + "type": "string", + "enum": [ + "fs:allow-template-read" + ] + }, + { + "description": "fs:allow-template-read-recursive -> This allows full recursive read access to the complete `$TEMPLATE` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-template-read-recursive" + ] + }, + { + "description": "fs:allow-template-write -> This allows non-recursive write access to the `$TEMPLATE` folder.", + "type": "string", + "enum": [ + "fs:allow-template-write" + ] + }, + { + "description": "fs:allow-template-write-recursive -> This allows full recursive write access to the complete `$TEMPLATE` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-template-write-recursive" + ] + }, + { + "description": "fs:allow-video-meta -> This allows non-recursive read access to metadata of the `$VIDEO` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-video-meta" + ] + }, + { + "description": "fs:allow-video-meta-recursive -> This allows full recursive read access to metadata of the `$VIDEO` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-video-meta-recursive" + ] + }, + { + "description": "fs:allow-video-read -> This allows non-recursive read access to the `$VIDEO` folder.", + "type": "string", + "enum": [ + "fs:allow-video-read" + ] + }, + { + "description": "fs:allow-video-read-recursive -> This allows full recursive read access to the complete `$VIDEO` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-video-read-recursive" + ] + }, + { + "description": "fs:allow-video-write -> This allows non-recursive write access to the `$VIDEO` folder.", + "type": "string", + "enum": [ + "fs:allow-video-write" + ] + }, + { + "description": "fs:allow-video-write-recursive -> This allows full recursive write access to the complete `$VIDEO` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-video-write-recursive" + ] + }, + { + "description": "fs:deny-default -> This denies access to dangerous Tauri relevant files and folders by default.", + "type": "string", + "enum": [ + "fs:deny-default" + ] + }, + { + "description": "fs:allow-copy-file -> Enables the copy_file command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:allow-copy-file" + ] + }, + { + "description": "fs:allow-create -> Enables the create command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:allow-create" + ] + }, + { + "description": "fs:allow-exists -> Enables the exists command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:allow-exists" + ] + }, + { + "description": "fs:allow-fstat -> Enables the fstat command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:allow-fstat" + ] + }, + { + "description": "fs:allow-ftruncate -> Enables the ftruncate command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:allow-ftruncate" + ] + }, + { + "description": "fs:allow-lstat -> Enables the lstat command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:allow-lstat" + ] + }, + { + "description": "fs:allow-mkdir -> Enables the mkdir command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:allow-mkdir" + ] + }, + { + "description": "fs:allow-open -> Enables the open command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:allow-open" + ] + }, + { + "description": "fs:allow-read -> Enables the read command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:allow-read" + ] + }, + { + "description": "fs:allow-read-dir -> Enables the read_dir command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:allow-read-dir" + ] + }, + { + "description": "fs:allow-read-file -> Enables the read_file command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:allow-read-file" + ] + }, + { + "description": "fs:allow-read-text-file -> Enables the read_text_file command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:allow-read-text-file" + ] + }, + { + "description": "fs:allow-read-text-file-lines -> Enables the read_text_file_lines command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:allow-read-text-file-lines" + ] + }, + { + "description": "fs:allow-read-text-file-lines-next -> Enables the read_text_file_lines_next command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:allow-read-text-file-lines-next" + ] + }, + { + "description": "fs:allow-remove -> Enables the remove command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:allow-remove" + ] + }, + { + "description": "fs:allow-rename -> Enables the rename command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:allow-rename" + ] + }, + { + "description": "fs:allow-seek -> Enables the seek command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:allow-seek" + ] + }, + { + "description": "fs:allow-stat -> Enables the stat command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:allow-stat" + ] + }, + { + "description": "fs:allow-truncate -> Enables the truncate command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:allow-truncate" + ] + }, + { + "description": "fs:allow-unwatch -> Enables the unwatch command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:allow-unwatch" + ] + }, + { + "description": "fs:allow-watch -> Enables the watch command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:allow-watch" + ] + }, + { + "description": "fs:allow-write -> Enables the write command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:allow-write" + ] + }, + { + "description": "fs:allow-write-file -> Enables the write_file command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:allow-write-file" + ] + }, + { + "description": "fs:allow-write-text-file -> Enables the write_text_file command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:allow-write-text-file" + ] + }, + { + "description": "fs:create-app-specific-dirs -> This permissions allows to create the application specific directories.\n", + "type": "string", + "enum": [ + "fs:create-app-specific-dirs" + ] + }, + { + "description": "fs:deny-copy-file -> Denies the copy_file command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:deny-copy-file" + ] + }, + { + "description": "fs:deny-create -> Denies the create command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:deny-create" + ] + }, + { + "description": "fs:deny-exists -> Denies the exists command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:deny-exists" + ] + }, + { + "description": "fs:deny-fstat -> Denies the fstat command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:deny-fstat" + ] + }, + { + "description": "fs:deny-ftruncate -> Denies the ftruncate command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:deny-ftruncate" + ] + }, + { + "description": "fs:deny-lstat -> Denies the lstat command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:deny-lstat" + ] + }, + { + "description": "fs:deny-mkdir -> Denies the mkdir command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:deny-mkdir" + ] + }, + { + "description": "fs:deny-open -> Denies the open command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:deny-open" + ] + }, + { + "description": "fs:deny-read -> Denies the read command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:deny-read" + ] + }, + { + "description": "fs:deny-read-dir -> Denies the read_dir command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:deny-read-dir" + ] + }, + { + "description": "fs:deny-read-file -> Denies the read_file command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:deny-read-file" + ] + }, + { + "description": "fs:deny-read-text-file -> Denies the read_text_file command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:deny-read-text-file" + ] + }, + { + "description": "fs:deny-read-text-file-lines -> Denies the read_text_file_lines command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:deny-read-text-file-lines" + ] + }, + { + "description": "fs:deny-read-text-file-lines-next -> Denies the read_text_file_lines_next command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:deny-read-text-file-lines-next" + ] + }, + { + "description": "fs:deny-remove -> Denies the remove command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:deny-remove" + ] + }, + { + "description": "fs:deny-rename -> Denies the rename command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:deny-rename" + ] + }, + { + "description": "fs:deny-seek -> Denies the seek command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:deny-seek" + ] + }, + { + "description": "fs:deny-stat -> Denies the stat command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:deny-stat" + ] + }, + { + "description": "fs:deny-truncate -> Denies the truncate command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:deny-truncate" + ] + }, + { + "description": "fs:deny-unwatch -> Denies the unwatch command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:deny-unwatch" + ] + }, + { + "description": "fs:deny-watch -> Denies the watch command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:deny-watch" + ] + }, + { + "description": "fs:deny-webview-data-linux -> This denies read access to the\n`$APPLOCALDATA` folder on linux as the webview data and configuration values are stored here.\nAllowing access can lead to sensitive information disclosure and should be well considered.", + "type": "string", + "enum": [ + "fs:deny-webview-data-linux" + ] + }, + { + "description": "fs:deny-webview-data-windows -> This denies read access to the\n`$APPLOCALDATA/EBWebView` folder on windows as the webview data and configuration values are stored here.\nAllowing access can lead to sensitive information disclosure and should be well considered.", + "type": "string", + "enum": [ + "fs:deny-webview-data-windows" + ] + }, + { + "description": "fs:deny-write -> Denies the write command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:deny-write" + ] + }, + { + "description": "fs:deny-write-file -> Denies the write_file command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:deny-write-file" + ] + }, + { + "description": "fs:deny-write-text-file -> Denies the write_text_file command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:deny-write-text-file" + ] + }, + { + "description": "fs:read-all -> This enables all read related commands without any pre-configured accessible paths.", + "type": "string", + "enum": [ + "fs:read-all" + ] + }, + { + "description": "fs:read-app-specific-dirs-recursive -> This permission allows recursive read functionality on the application\nspecific base directories. \n", + "type": "string", + "enum": [ + "fs:read-app-specific-dirs-recursive" + ] + }, + { + "description": "fs:read-dirs -> This enables directory read and file metadata related commands without any pre-configured accessible paths.", + "type": "string", + "enum": [ + "fs:read-dirs" + ] + }, + { + "description": "fs:read-files -> This enables file read related commands without any pre-configured accessible paths.", + "type": "string", + "enum": [ + "fs:read-files" + ] + }, + { + "description": "fs:read-meta -> This enables all index or metadata related commands without any pre-configured accessible paths.", + "type": "string", + "enum": [ + "fs:read-meta" + ] + }, + { + "description": "fs:scope -> An empty permission you can use to modify the global scope.", + "type": "string", + "enum": [ + "fs:scope" + ] + }, + { + "description": "fs:scope-app -> This scope permits access to all files and list content of top level directories in the `$APP`folder.", + "type": "string", + "enum": [ + "fs:scope-app" + ] + }, + { + "description": "fs:scope-app-index -> This scope permits to list all files and folders in the `$APP`folder.", + "type": "string", + "enum": [ + "fs:scope-app-index" + ] + }, + { + "description": "fs:scope-app-recursive -> This scope permits recursive access to the complete `$APP` folder, including sub directories and files.", + "type": "string", + "enum": [ + "fs:scope-app-recursive" + ] + }, + { + "description": "fs:scope-appcache -> This scope permits access to all files and list content of top level directories in the `$APPCACHE`folder.", + "type": "string", + "enum": [ + "fs:scope-appcache" + ] + }, + { + "description": "fs:scope-appcache-index -> This scope permits to list all files and folders in the `$APPCACHE`folder.", + "type": "string", + "enum": [ + "fs:scope-appcache-index" + ] + }, + { + "description": "fs:scope-appcache-recursive -> This scope permits recursive access to the complete `$APPCACHE` folder, including sub directories and files.", + "type": "string", + "enum": [ + "fs:scope-appcache-recursive" + ] + }, + { + "description": "fs:scope-appconfig -> This scope permits access to all files and list content of top level directories in the `$APPCONFIG`folder.", + "type": "string", + "enum": [ + "fs:scope-appconfig" + ] + }, + { + "description": "fs:scope-appconfig-index -> This scope permits to list all files and folders in the `$APPCONFIG`folder.", + "type": "string", + "enum": [ + "fs:scope-appconfig-index" + ] + }, + { + "description": "fs:scope-appconfig-recursive -> This scope permits recursive access to the complete `$APPCONFIG` folder, including sub directories and files.", + "type": "string", + "enum": [ + "fs:scope-appconfig-recursive" + ] + }, + { + "description": "fs:scope-appdata -> This scope permits access to all files and list content of top level directories in the `$APPDATA`folder.", + "type": "string", + "enum": [ + "fs:scope-appdata" + ] + }, + { + "description": "fs:scope-appdata-index -> This scope permits to list all files and folders in the `$APPDATA`folder.", + "type": "string", + "enum": [ + "fs:scope-appdata-index" + ] + }, + { + "description": "fs:scope-appdata-recursive -> This scope permits recursive access to the complete `$APPDATA` folder, including sub directories and files.", + "type": "string", + "enum": [ + "fs:scope-appdata-recursive" + ] + }, + { + "description": "fs:scope-applocaldata -> This scope permits access to all files and list content of top level directories in the `$APPLOCALDATA`folder.", + "type": "string", + "enum": [ + "fs:scope-applocaldata" + ] + }, + { + "description": "fs:scope-applocaldata-index -> This scope permits to list all files and folders in the `$APPLOCALDATA`folder.", + "type": "string", + "enum": [ + "fs:scope-applocaldata-index" + ] + }, + { + "description": "fs:scope-applocaldata-recursive -> This scope permits recursive access to the complete `$APPLOCALDATA` folder, including sub directories and files.", + "type": "string", + "enum": [ + "fs:scope-applocaldata-recursive" + ] + }, + { + "description": "fs:scope-applog -> This scope permits access to all files and list content of top level directories in the `$APPLOG`folder.", + "type": "string", + "enum": [ + "fs:scope-applog" + ] + }, + { + "description": "fs:scope-applog-index -> This scope permits to list all files and folders in the `$APPLOG`folder.", + "type": "string", + "enum": [ + "fs:scope-applog-index" + ] + }, + { + "description": "fs:scope-applog-recursive -> This scope permits recursive access to the complete `$APPLOG` folder, including sub directories and files.", + "type": "string", + "enum": [ + "fs:scope-applog-recursive" + ] + }, + { + "description": "fs:scope-audio -> This scope permits access to all files and list content of top level directories in the `$AUDIO`folder.", + "type": "string", + "enum": [ + "fs:scope-audio" + ] + }, + { + "description": "fs:scope-audio-index -> This scope permits to list all files and folders in the `$AUDIO`folder.", + "type": "string", + "enum": [ + "fs:scope-audio-index" + ] + }, + { + "description": "fs:scope-audio-recursive -> This scope permits recursive access to the complete `$AUDIO` folder, including sub directories and files.", + "type": "string", + "enum": [ + "fs:scope-audio-recursive" + ] + }, + { + "description": "fs:scope-cache -> This scope permits access to all files and list content of top level directories in the `$CACHE`folder.", + "type": "string", + "enum": [ + "fs:scope-cache" + ] + }, + { + "description": "fs:scope-cache-index -> This scope permits to list all files and folders in the `$CACHE`folder.", + "type": "string", + "enum": [ + "fs:scope-cache-index" + ] + }, + { + "description": "fs:scope-cache-recursive -> This scope permits recursive access to the complete `$CACHE` folder, including sub directories and files.", + "type": "string", + "enum": [ + "fs:scope-cache-recursive" + ] + }, + { + "description": "fs:scope-config -> This scope permits access to all files and list content of top level directories in the `$CONFIG`folder.", + "type": "string", + "enum": [ + "fs:scope-config" + ] + }, + { + "description": "fs:scope-config-index -> This scope permits to list all files and folders in the `$CONFIG`folder.", + "type": "string", + "enum": [ + "fs:scope-config-index" + ] + }, + { + "description": "fs:scope-config-recursive -> This scope permits recursive access to the complete `$CONFIG` folder, including sub directories and files.", + "type": "string", + "enum": [ + "fs:scope-config-recursive" + ] + }, + { + "description": "fs:scope-data -> This scope permits access to all files and list content of top level directories in the `$DATA`folder.", + "type": "string", + "enum": [ + "fs:scope-data" + ] + }, + { + "description": "fs:scope-data-index -> This scope permits to list all files and folders in the `$DATA`folder.", + "type": "string", + "enum": [ + "fs:scope-data-index" + ] + }, + { + "description": "fs:scope-data-recursive -> This scope permits recursive access to the complete `$DATA` folder, including sub directories and files.", + "type": "string", + "enum": [ + "fs:scope-data-recursive" + ] + }, + { + "description": "fs:scope-desktop -> This scope permits access to all files and list content of top level directories in the `$DESKTOP`folder.", + "type": "string", + "enum": [ + "fs:scope-desktop" + ] + }, + { + "description": "fs:scope-desktop-index -> This scope permits to list all files and folders in the `$DESKTOP`folder.", + "type": "string", + "enum": [ + "fs:scope-desktop-index" + ] + }, + { + "description": "fs:scope-desktop-recursive -> This scope permits recursive access to the complete `$DESKTOP` folder, including sub directories and files.", + "type": "string", + "enum": [ + "fs:scope-desktop-recursive" + ] + }, + { + "description": "fs:scope-document -> This scope permits access to all files and list content of top level directories in the `$DOCUMENT`folder.", + "type": "string", + "enum": [ + "fs:scope-document" + ] + }, + { + "description": "fs:scope-document-index -> This scope permits to list all files and folders in the `$DOCUMENT`folder.", + "type": "string", + "enum": [ + "fs:scope-document-index" + ] + }, + { + "description": "fs:scope-document-recursive -> This scope permits recursive access to the complete `$DOCUMENT` folder, including sub directories and files.", + "type": "string", + "enum": [ + "fs:scope-document-recursive" + ] + }, + { + "description": "fs:scope-download -> This scope permits access to all files and list content of top level directories in the `$DOWNLOAD`folder.", + "type": "string", + "enum": [ + "fs:scope-download" + ] + }, + { + "description": "fs:scope-download-index -> This scope permits to list all files and folders in the `$DOWNLOAD`folder.", + "type": "string", + "enum": [ + "fs:scope-download-index" + ] + }, + { + "description": "fs:scope-download-recursive -> This scope permits recursive access to the complete `$DOWNLOAD` folder, including sub directories and files.", + "type": "string", + "enum": [ + "fs:scope-download-recursive" + ] + }, + { + "description": "fs:scope-exe -> This scope permits access to all files and list content of top level directories in the `$EXE`folder.", + "type": "string", + "enum": [ + "fs:scope-exe" + ] + }, + { + "description": "fs:scope-exe-index -> This scope permits to list all files and folders in the `$EXE`folder.", + "type": "string", + "enum": [ + "fs:scope-exe-index" + ] + }, + { + "description": "fs:scope-exe-recursive -> This scope permits recursive access to the complete `$EXE` folder, including sub directories and files.", + "type": "string", + "enum": [ + "fs:scope-exe-recursive" + ] + }, + { + "description": "fs:scope-font -> This scope permits access to all files and list content of top level directories in the `$FONT`folder.", + "type": "string", + "enum": [ + "fs:scope-font" + ] + }, + { + "description": "fs:scope-font-index -> This scope permits to list all files and folders in the `$FONT`folder.", + "type": "string", + "enum": [ + "fs:scope-font-index" + ] + }, + { + "description": "fs:scope-font-recursive -> This scope permits recursive access to the complete `$FONT` folder, including sub directories and files.", + "type": "string", + "enum": [ + "fs:scope-font-recursive" + ] + }, + { + "description": "fs:scope-home -> This scope permits access to all files and list content of top level directories in the `$HOME`folder.", + "type": "string", + "enum": [ + "fs:scope-home" + ] + }, + { + "description": "fs:scope-home-index -> This scope permits to list all files and folders in the `$HOME`folder.", + "type": "string", + "enum": [ + "fs:scope-home-index" + ] + }, + { + "description": "fs:scope-home-recursive -> This scope permits recursive access to the complete `$HOME` folder, including sub directories and files.", + "type": "string", + "enum": [ + "fs:scope-home-recursive" + ] + }, + { + "description": "fs:scope-localdata -> This scope permits access to all files and list content of top level directories in the `$LOCALDATA`folder.", + "type": "string", + "enum": [ + "fs:scope-localdata" + ] + }, + { + "description": "fs:scope-localdata-index -> This scope permits to list all files and folders in the `$LOCALDATA`folder.", + "type": "string", + "enum": [ + "fs:scope-localdata-index" + ] + }, + { + "description": "fs:scope-localdata-recursive -> This scope permits recursive access to the complete `$LOCALDATA` folder, including sub directories and files.", + "type": "string", + "enum": [ + "fs:scope-localdata-recursive" + ] + }, + { + "description": "fs:scope-log -> This scope permits access to all files and list content of top level directories in the `$LOG`folder.", + "type": "string", + "enum": [ + "fs:scope-log" + ] + }, + { + "description": "fs:scope-log-index -> This scope permits to list all files and folders in the `$LOG`folder.", + "type": "string", + "enum": [ + "fs:scope-log-index" + ] + }, + { + "description": "fs:scope-log-recursive -> This scope permits recursive access to the complete `$LOG` folder, including sub directories and files.", + "type": "string", + "enum": [ + "fs:scope-log-recursive" + ] + }, + { + "description": "fs:scope-picture -> This scope permits access to all files and list content of top level directories in the `$PICTURE`folder.", + "type": "string", + "enum": [ + "fs:scope-picture" + ] + }, + { + "description": "fs:scope-picture-index -> This scope permits to list all files and folders in the `$PICTURE`folder.", + "type": "string", + "enum": [ + "fs:scope-picture-index" + ] + }, + { + "description": "fs:scope-picture-recursive -> This scope permits recursive access to the complete `$PICTURE` folder, including sub directories and files.", + "type": "string", + "enum": [ + "fs:scope-picture-recursive" + ] + }, + { + "description": "fs:scope-public -> This scope permits access to all files and list content of top level directories in the `$PUBLIC`folder.", + "type": "string", + "enum": [ + "fs:scope-public" + ] + }, + { + "description": "fs:scope-public-index -> This scope permits to list all files and folders in the `$PUBLIC`folder.", + "type": "string", + "enum": [ + "fs:scope-public-index" + ] + }, + { + "description": "fs:scope-public-recursive -> This scope permits recursive access to the complete `$PUBLIC` folder, including sub directories and files.", + "type": "string", + "enum": [ + "fs:scope-public-recursive" + ] + }, + { + "description": "fs:scope-resource -> This scope permits access to all files and list content of top level directories in the `$RESOURCE`folder.", + "type": "string", + "enum": [ + "fs:scope-resource" + ] + }, + { + "description": "fs:scope-resource-index -> This scope permits to list all files and folders in the `$RESOURCE`folder.", + "type": "string", + "enum": [ + "fs:scope-resource-index" + ] + }, + { + "description": "fs:scope-resource-recursive -> This scope permits recursive access to the complete `$RESOURCE` folder, including sub directories and files.", + "type": "string", + "enum": [ + "fs:scope-resource-recursive" + ] + }, + { + "description": "fs:scope-runtime -> This scope permits access to all files and list content of top level directories in the `$RUNTIME`folder.", + "type": "string", + "enum": [ + "fs:scope-runtime" + ] + }, + { + "description": "fs:scope-runtime-index -> This scope permits to list all files and folders in the `$RUNTIME`folder.", + "type": "string", + "enum": [ + "fs:scope-runtime-index" + ] + }, + { + "description": "fs:scope-runtime-recursive -> This scope permits recursive access to the complete `$RUNTIME` folder, including sub directories and files.", + "type": "string", + "enum": [ + "fs:scope-runtime-recursive" + ] + }, + { + "description": "fs:scope-temp -> This scope permits access to all files and list content of top level directories in the `$TEMP`folder.", + "type": "string", + "enum": [ + "fs:scope-temp" + ] + }, + { + "description": "fs:scope-temp-index -> This scope permits to list all files and folders in the `$TEMP`folder.", + "type": "string", + "enum": [ + "fs:scope-temp-index" + ] + }, + { + "description": "fs:scope-temp-recursive -> This scope permits recursive access to the complete `$TEMP` folder, including sub directories and files.", + "type": "string", + "enum": [ + "fs:scope-temp-recursive" + ] + }, + { + "description": "fs:scope-template -> This scope permits access to all files and list content of top level directories in the `$TEMPLATE`folder.", + "type": "string", + "enum": [ + "fs:scope-template" + ] + }, + { + "description": "fs:scope-template-index -> This scope permits to list all files and folders in the `$TEMPLATE`folder.", + "type": "string", + "enum": [ + "fs:scope-template-index" + ] + }, + { + "description": "fs:scope-template-recursive -> This scope permits recursive access to the complete `$TEMPLATE` folder, including sub directories and files.", + "type": "string", + "enum": [ + "fs:scope-template-recursive" + ] + }, + { + "description": "fs:scope-video -> This scope permits access to all files and list content of top level directories in the `$VIDEO`folder.", + "type": "string", + "enum": [ + "fs:scope-video" + ] + }, + { + "description": "fs:scope-video-index -> This scope permits to list all files and folders in the `$VIDEO`folder.", + "type": "string", + "enum": [ + "fs:scope-video-index" + ] + }, + { + "description": "fs:scope-video-recursive -> This scope permits recursive access to the complete `$VIDEO` folder, including sub directories and files.", + "type": "string", + "enum": [ + "fs:scope-video-recursive" + ] + }, + { + "description": "fs:write-all -> This enables all write related commands without any pre-configured accessible paths.", + "type": "string", + "enum": [ + "fs:write-all" + ] + }, + { + "description": "fs:write-files -> This enables all file write related commands without any pre-configured accessible paths.", + "type": "string", + "enum": [ + "fs:write-files" + ] + } + ] + }, + "allow": { + "items": { + "title": "FsScopeEntry", + "description": "FS scope entry.", + "anyOf": [ + { + "description": "FS scope path.", + "type": "string" + }, + { + "type": "object", + "required": [ + "path" + ], + "properties": { + "path": { + "description": "FS scope path.", + "type": "string" + } + } + } + ] + } + }, + "deny": { + "items": { + "title": "FsScopeEntry", + "description": "FS scope entry.", + "anyOf": [ + { + "description": "FS scope path.", + "type": "string" + }, + { + "type": "object", + "required": [ + "path" + ], + "properties": { + "path": { + "description": "FS scope path.", + "type": "string" + } + } + } + ] + } + } + } + }, + { + "type": "object", + "required": [ + "identifier" + ], + "properties": { + "identifier": { + "oneOf": [ + { + "description": "shell:default -> This permission set configures which\nshell functionality is exposed by default.\n\n#### Granted Permissions\n\nIt allows to use the `open` functionality without any specific\nscope pre-configured. It will allow opening `http(s)://`,\n`tel:` and `mailto:` links.\n", + "type": "string", + "enum": [ + "shell:default" + ] + }, + { + "description": "shell:allow-execute -> Enables the execute command without any pre-configured scope.", + "type": "string", + "enum": [ + "shell:allow-execute" + ] + }, + { + "description": "shell:allow-kill -> Enables the kill command without any pre-configured scope.", + "type": "string", + "enum": [ + "shell:allow-kill" + ] + }, + { + "description": "shell:allow-open -> Enables the open command without any pre-configured scope.", + "type": "string", + "enum": [ + "shell:allow-open" + ] + }, + { + "description": "shell:allow-spawn -> Enables the spawn command without any pre-configured scope.", + "type": "string", + "enum": [ + "shell:allow-spawn" + ] + }, + { + "description": "shell:allow-stdin-write -> Enables the stdin_write command without any pre-configured scope.", + "type": "string", + "enum": [ + "shell:allow-stdin-write" + ] + }, + { + "description": "shell:deny-execute -> Denies the execute command without any pre-configured scope.", + "type": "string", + "enum": [ + "shell:deny-execute" + ] + }, + { + "description": "shell:deny-kill -> Denies the kill command without any pre-configured scope.", + "type": "string", + "enum": [ + "shell:deny-kill" + ] + }, + { + "description": "shell:deny-open -> Denies the open command without any pre-configured scope.", + "type": "string", + "enum": [ + "shell:deny-open" + ] + }, + { + "description": "shell:deny-spawn -> Denies the spawn command without any pre-configured scope.", + "type": "string", + "enum": [ + "shell:deny-spawn" + ] + }, + { + "description": "shell:deny-stdin-write -> Denies the stdin_write command without any pre-configured scope.", + "type": "string", + "enum": [ + "shell:deny-stdin-write" + ] + } + ] + }, + "allow": { + "items": { + "title": "Entry", + "description": "A command allowed to be executed by the webview API.", + "type": "object", + "required": [ + "args", + "cmd", + "name", + "sidecar" + ], + "properties": { + "args": { + "description": "The allowed arguments for the command execution.", + "allOf": [ + { + "$ref": "#/definitions/ShellAllowedArgs" + } + ] + }, + "cmd": { + "description": "The command name. It can start with a variable that resolves to a system base directory. The variables are: `$AUDIO`, `$CACHE`, `$CONFIG`, `$DATA`, `$LOCALDATA`, `$DESKTOP`, `$DOCUMENT`, `$DOWNLOAD`, `$EXE`, `$FONT`, `$HOME`, `$PICTURE`, `$PUBLIC`, `$RUNTIME`, `$TEMPLATE`, `$VIDEO`, `$RESOURCE`, `$APP`, `$LOG`, `$TEMP`, `$APPCONFIG`, `$APPDATA`, `$APPLOCALDATA`, `$APPCACHE`, `$APPLOG`.", + "type": "string" + }, + "name": { + "description": "The name for this allowed shell command configuration.\n\nThis name will be used inside of the webview API to call this command along with any specified arguments.", + "type": "string" + }, + "sidecar": { + "description": "If this command is a sidecar command.", + "type": "boolean" + } + } + } + }, + "deny": { + "items": { + "title": "Entry", + "description": "A command allowed to be executed by the webview API.", + "type": "object", + "required": [ + "args", + "cmd", + "name", + "sidecar" + ], + "properties": { + "args": { + "description": "The allowed arguments for the command execution.", + "allOf": [ + { + "$ref": "#/definitions/ShellAllowedArgs" + } + ] + }, + "cmd": { + "description": "The command name. It can start with a variable that resolves to a system base directory. The variables are: `$AUDIO`, `$CACHE`, `$CONFIG`, `$DATA`, `$LOCALDATA`, `$DESKTOP`, `$DOCUMENT`, `$DOWNLOAD`, `$EXE`, `$FONT`, `$HOME`, `$PICTURE`, `$PUBLIC`, `$RUNTIME`, `$TEMPLATE`, `$VIDEO`, `$RESOURCE`, `$APP`, `$LOG`, `$TEMP`, `$APPCONFIG`, `$APPDATA`, `$APPLOCALDATA`, `$APPCACHE`, `$APPLOG`.", + "type": "string" + }, + "name": { + "description": "The name for this allowed shell command configuration.\n\nThis name will be used inside of the webview API to call this command along with any specified arguments.", + "type": "string" + }, + "sidecar": { + "description": "If this command is a sidecar command.", + "type": "boolean" + } + } + } + } + } + } + ] + } + ] + }, + "Identifier": { + "oneOf": [ + { + "description": "clipboard-manager:default -> No features are enabled by default, as we believe\nthe clipboard can be inherently dangerous and it is \napplication specific if read and/or write access is needed.\n\nClipboard interaction needs to be explicitly enabled.\n", + "type": "string", + "enum": [ + "clipboard-manager:default" + ] + }, + { + "description": "clipboard-manager:allow-clear -> Enables the clear command without any pre-configured scope.", + "type": "string", + "enum": [ + "clipboard-manager:allow-clear" + ] + }, + { + "description": "clipboard-manager:allow-read-image -> Enables the read_image command without any pre-configured scope.", + "type": "string", + "enum": [ + "clipboard-manager:allow-read-image" + ] + }, + { + "description": "clipboard-manager:allow-read-text -> Enables the read_text command without any pre-configured scope.", + "type": "string", + "enum": [ + "clipboard-manager:allow-read-text" + ] + }, + { + "description": "clipboard-manager:allow-write-html -> Enables the write_html command without any pre-configured scope.", + "type": "string", + "enum": [ + "clipboard-manager:allow-write-html" + ] + }, + { + "description": "clipboard-manager:allow-write-image -> Enables the write_image command without any pre-configured scope.", + "type": "string", + "enum": [ + "clipboard-manager:allow-write-image" + ] + }, + { + "description": "clipboard-manager:allow-write-text -> Enables the write_text command without any pre-configured scope.", + "type": "string", + "enum": [ + "clipboard-manager:allow-write-text" + ] + }, + { + "description": "clipboard-manager:deny-clear -> Denies the clear command without any pre-configured scope.", + "type": "string", + "enum": [ + "clipboard-manager:deny-clear" + ] + }, + { + "description": "clipboard-manager:deny-read-image -> Denies the read_image command without any pre-configured scope.", + "type": "string", + "enum": [ + "clipboard-manager:deny-read-image" + ] + }, + { + "description": "clipboard-manager:deny-read-text -> Denies the read_text command without any pre-configured scope.", + "type": "string", + "enum": [ + "clipboard-manager:deny-read-text" + ] + }, + { + "description": "clipboard-manager:deny-write-html -> Denies the write_html command without any pre-configured scope.", + "type": "string", + "enum": [ + "clipboard-manager:deny-write-html" + ] + }, + { + "description": "clipboard-manager:deny-write-image -> Denies the write_image command without any pre-configured scope.", + "type": "string", + "enum": [ + "clipboard-manager:deny-write-image" + ] + }, + { + "description": "clipboard-manager:deny-write-text -> Denies the write_text command without any pre-configured scope.", + "type": "string", + "enum": [ + "clipboard-manager:deny-write-text" + ] + }, + { + "description": "core:app:default -> Default permissions for the plugin.", + "type": "string", + "enum": [ + "core:app:default" + ] + }, + { + "description": "core:app:allow-app-hide -> Enables the app_hide command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:app:allow-app-hide" + ] + }, + { + "description": "core:app:allow-app-show -> Enables the app_show command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:app:allow-app-show" + ] + }, + { + "description": "core:app:allow-default-window-icon -> Enables the default_window_icon command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:app:allow-default-window-icon" + ] + }, + { + "description": "core:app:allow-name -> Enables the name command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:app:allow-name" + ] + }, + { + "description": "core:app:allow-tauri-version -> Enables the tauri_version command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:app:allow-tauri-version" + ] + }, + { + "description": "core:app:allow-version -> Enables the version command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:app:allow-version" + ] + }, + { + "description": "core:app:deny-app-hide -> Denies the app_hide command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:app:deny-app-hide" + ] + }, + { + "description": "core:app:deny-app-show -> Denies the app_show command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:app:deny-app-show" + ] + }, + { + "description": "core:app:deny-default-window-icon -> Denies the default_window_icon command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:app:deny-default-window-icon" + ] + }, + { + "description": "core:app:deny-name -> Denies the name command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:app:deny-name" + ] + }, + { + "description": "core:app:deny-tauri-version -> Denies the tauri_version command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:app:deny-tauri-version" + ] + }, + { + "description": "core:app:deny-version -> Denies the version command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:app:deny-version" + ] + }, + { + "description": "core:event:default -> Default permissions for the plugin.", + "type": "string", + "enum": [ + "core:event:default" + ] + }, + { + "description": "core:event:allow-emit -> Enables the emit command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:event:allow-emit" + ] + }, + { + "description": "core:event:allow-emit-to -> Enables the emit_to command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:event:allow-emit-to" + ] + }, + { + "description": "core:event:allow-listen -> Enables the listen command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:event:allow-listen" + ] + }, + { + "description": "core:event:allow-unlisten -> Enables the unlisten command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:event:allow-unlisten" + ] + }, + { + "description": "core:event:deny-emit -> Denies the emit command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:event:deny-emit" + ] + }, + { + "description": "core:event:deny-emit-to -> Denies the emit_to command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:event:deny-emit-to" + ] + }, + { + "description": "core:event:deny-listen -> Denies the listen command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:event:deny-listen" + ] + }, + { + "description": "core:event:deny-unlisten -> Denies the unlisten command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:event:deny-unlisten" + ] + }, + { + "description": "core:image:default -> Default permissions for the plugin.", + "type": "string", + "enum": [ + "core:image:default" + ] + }, + { + "description": "core:image:allow-from-bytes -> Enables the from_bytes command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:image:allow-from-bytes" + ] + }, + { + "description": "core:image:allow-from-path -> Enables the from_path command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:image:allow-from-path" + ] + }, + { + "description": "core:image:allow-new -> Enables the new command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:image:allow-new" + ] + }, + { + "description": "core:image:allow-rgba -> Enables the rgba command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:image:allow-rgba" + ] + }, + { + "description": "core:image:allow-size -> Enables the size command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:image:allow-size" + ] + }, + { + "description": "core:image:deny-from-bytes -> Denies the from_bytes command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:image:deny-from-bytes" + ] + }, + { + "description": "core:image:deny-from-path -> Denies the from_path command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:image:deny-from-path" + ] + }, + { + "description": "core:image:deny-new -> Denies the new command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:image:deny-new" + ] + }, + { + "description": "core:image:deny-rgba -> Denies the rgba command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:image:deny-rgba" + ] + }, + { + "description": "core:image:deny-size -> Denies the size command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:image:deny-size" + ] + }, + { + "description": "core:menu:default -> Default permissions for the plugin.", + "type": "string", + "enum": [ + "core:menu:default" + ] + }, + { + "description": "core:menu:allow-append -> Enables the append command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:menu:allow-append" + ] + }, + { + "description": "core:menu:allow-create-default -> Enables the create_default command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:menu:allow-create-default" + ] + }, + { + "description": "core:menu:allow-get -> Enables the get command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:menu:allow-get" + ] + }, + { + "description": "core:menu:allow-insert -> Enables the insert command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:menu:allow-insert" + ] + }, + { + "description": "core:menu:allow-is-checked -> Enables the is_checked command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:menu:allow-is-checked" + ] + }, + { + "description": "core:menu:allow-is-enabled -> Enables the is_enabled command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:menu:allow-is-enabled" + ] + }, + { + "description": "core:menu:allow-items -> Enables the items command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:menu:allow-items" + ] + }, + { + "description": "core:menu:allow-new -> Enables the new command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:menu:allow-new" + ] + }, + { + "description": "core:menu:allow-popup -> Enables the popup command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:menu:allow-popup" + ] + }, + { + "description": "core:menu:allow-prepend -> Enables the prepend command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:menu:allow-prepend" + ] + }, + { + "description": "core:menu:allow-remove -> Enables the remove command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:menu:allow-remove" + ] + }, + { + "description": "core:menu:allow-remove-at -> Enables the remove_at command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:menu:allow-remove-at" + ] + }, + { + "description": "core:menu:allow-set-accelerator -> Enables the set_accelerator command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:menu:allow-set-accelerator" + ] + }, + { + "description": "core:menu:allow-set-as-app-menu -> Enables the set_as_app_menu command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:menu:allow-set-as-app-menu" + ] + }, + { + "description": "core:menu:allow-set-as-help-menu-for-nsapp -> Enables the set_as_help_menu_for_nsapp command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:menu:allow-set-as-help-menu-for-nsapp" + ] + }, + { + "description": "core:menu:allow-set-as-window-menu -> Enables the set_as_window_menu command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:menu:allow-set-as-window-menu" + ] + }, + { + "description": "core:menu:allow-set-as-windows-menu-for-nsapp -> Enables the set_as_windows_menu_for_nsapp command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:menu:allow-set-as-windows-menu-for-nsapp" + ] + }, + { + "description": "core:menu:allow-set-checked -> Enables the set_checked command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:menu:allow-set-checked" + ] + }, + { + "description": "core:menu:allow-set-enabled -> Enables the set_enabled command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:menu:allow-set-enabled" + ] + }, + { + "description": "core:menu:allow-set-icon -> Enables the set_icon command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:menu:allow-set-icon" + ] + }, + { + "description": "core:menu:allow-set-text -> Enables the set_text command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:menu:allow-set-text" + ] + }, + { + "description": "core:menu:allow-text -> Enables the text command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:menu:allow-text" + ] + }, + { + "description": "core:menu:deny-append -> Denies the append command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:menu:deny-append" + ] + }, + { + "description": "core:menu:deny-create-default -> Denies the create_default command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:menu:deny-create-default" + ] + }, + { + "description": "core:menu:deny-get -> Denies the get command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:menu:deny-get" + ] + }, + { + "description": "core:menu:deny-insert -> Denies the insert command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:menu:deny-insert" + ] + }, + { + "description": "core:menu:deny-is-checked -> Denies the is_checked command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:menu:deny-is-checked" + ] + }, + { + "description": "core:menu:deny-is-enabled -> Denies the is_enabled command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:menu:deny-is-enabled" + ] + }, + { + "description": "core:menu:deny-items -> Denies the items command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:menu:deny-items" + ] + }, + { + "description": "core:menu:deny-new -> Denies the new command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:menu:deny-new" + ] + }, + { + "description": "core:menu:deny-popup -> Denies the popup command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:menu:deny-popup" + ] + }, + { + "description": "core:menu:deny-prepend -> Denies the prepend command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:menu:deny-prepend" + ] + }, + { + "description": "core:menu:deny-remove -> Denies the remove command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:menu:deny-remove" + ] + }, + { + "description": "core:menu:deny-remove-at -> Denies the remove_at command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:menu:deny-remove-at" + ] + }, + { + "description": "core:menu:deny-set-accelerator -> Denies the set_accelerator command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:menu:deny-set-accelerator" + ] + }, + { + "description": "core:menu:deny-set-as-app-menu -> Denies the set_as_app_menu command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:menu:deny-set-as-app-menu" + ] + }, + { + "description": "core:menu:deny-set-as-help-menu-for-nsapp -> Denies the set_as_help_menu_for_nsapp command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:menu:deny-set-as-help-menu-for-nsapp" + ] + }, + { + "description": "core:menu:deny-set-as-window-menu -> Denies the set_as_window_menu command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:menu:deny-set-as-window-menu" + ] + }, + { + "description": "core:menu:deny-set-as-windows-menu-for-nsapp -> Denies the set_as_windows_menu_for_nsapp command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:menu:deny-set-as-windows-menu-for-nsapp" + ] + }, + { + "description": "core:menu:deny-set-checked -> Denies the set_checked command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:menu:deny-set-checked" + ] + }, + { + "description": "core:menu:deny-set-enabled -> Denies the set_enabled command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:menu:deny-set-enabled" + ] + }, + { + "description": "core:menu:deny-set-icon -> Denies the set_icon command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:menu:deny-set-icon" + ] + }, + { + "description": "core:menu:deny-set-text -> Denies the set_text command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:menu:deny-set-text" + ] + }, + { + "description": "core:menu:deny-text -> Denies the text command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:menu:deny-text" + ] + }, + { + "description": "core:path:default -> Default permissions for the plugin.", + "type": "string", + "enum": [ + "core:path:default" + ] + }, + { + "description": "core:path:allow-basename -> Enables the basename command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:path:allow-basename" + ] + }, + { + "description": "core:path:allow-dirname -> Enables the dirname command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:path:allow-dirname" + ] + }, + { + "description": "core:path:allow-extname -> Enables the extname command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:path:allow-extname" + ] + }, + { + "description": "core:path:allow-is-absolute -> Enables the is_absolute command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:path:allow-is-absolute" + ] + }, + { + "description": "core:path:allow-join -> Enables the join command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:path:allow-join" + ] + }, + { + "description": "core:path:allow-normalize -> Enables the normalize command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:path:allow-normalize" + ] + }, + { + "description": "core:path:allow-resolve -> Enables the resolve command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:path:allow-resolve" + ] + }, + { + "description": "core:path:allow-resolve-directory -> Enables the resolve_directory command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:path:allow-resolve-directory" + ] + }, + { + "description": "core:path:deny-basename -> Denies the basename command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:path:deny-basename" + ] + }, + { + "description": "core:path:deny-dirname -> Denies the dirname command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:path:deny-dirname" + ] + }, + { + "description": "core:path:deny-extname -> Denies the extname command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:path:deny-extname" + ] + }, + { + "description": "core:path:deny-is-absolute -> Denies the is_absolute command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:path:deny-is-absolute" + ] + }, + { + "description": "core:path:deny-join -> Denies the join command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:path:deny-join" + ] + }, + { + "description": "core:path:deny-normalize -> Denies the normalize command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:path:deny-normalize" + ] + }, + { + "description": "core:path:deny-resolve -> Denies the resolve command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:path:deny-resolve" + ] + }, + { + "description": "core:path:deny-resolve-directory -> Denies the resolve_directory command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:path:deny-resolve-directory" + ] + }, + { + "description": "core:resources:default -> Default permissions for the plugin.", + "type": "string", + "enum": [ + "core:resources:default" + ] + }, + { + "description": "core:resources:allow-close -> Enables the close command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:resources:allow-close" + ] + }, + { + "description": "core:resources:deny-close -> Denies the close command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:resources:deny-close" + ] + }, + { + "description": "core:tray:default -> Default permissions for the plugin.", + "type": "string", + "enum": [ + "core:tray:default" + ] + }, + { + "description": "core:tray:allow-get-by-id -> Enables the get_by_id command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:tray:allow-get-by-id" + ] + }, + { + "description": "core:tray:allow-new -> Enables the new command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:tray:allow-new" + ] + }, + { + "description": "core:tray:allow-remove-by-id -> Enables the remove_by_id command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:tray:allow-remove-by-id" + ] + }, + { + "description": "core:tray:allow-set-icon -> Enables the set_icon command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:tray:allow-set-icon" + ] + }, + { + "description": "core:tray:allow-set-icon-as-template -> Enables the set_icon_as_template command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:tray:allow-set-icon-as-template" + ] + }, + { + "description": "core:tray:allow-set-menu -> Enables the set_menu command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:tray:allow-set-menu" + ] + }, + { + "description": "core:tray:allow-set-show-menu-on-left-click -> Enables the set_show_menu_on_left_click command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:tray:allow-set-show-menu-on-left-click" + ] + }, + { + "description": "core:tray:allow-set-temp-dir-path -> Enables the set_temp_dir_path command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:tray:allow-set-temp-dir-path" + ] + }, + { + "description": "core:tray:allow-set-title -> Enables the set_title command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:tray:allow-set-title" + ] + }, + { + "description": "core:tray:allow-set-tooltip -> Enables the set_tooltip command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:tray:allow-set-tooltip" + ] + }, + { + "description": "core:tray:allow-set-visible -> Enables the set_visible command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:tray:allow-set-visible" + ] + }, + { + "description": "core:tray:deny-get-by-id -> Denies the get_by_id command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:tray:deny-get-by-id" + ] + }, + { + "description": "core:tray:deny-new -> Denies the new command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:tray:deny-new" + ] + }, + { + "description": "core:tray:deny-remove-by-id -> Denies the remove_by_id command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:tray:deny-remove-by-id" + ] + }, + { + "description": "core:tray:deny-set-icon -> Denies the set_icon command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:tray:deny-set-icon" + ] + }, + { + "description": "core:tray:deny-set-icon-as-template -> Denies the set_icon_as_template command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:tray:deny-set-icon-as-template" + ] + }, + { + "description": "core:tray:deny-set-menu -> Denies the set_menu command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:tray:deny-set-menu" + ] + }, + { + "description": "core:tray:deny-set-show-menu-on-left-click -> Denies the set_show_menu_on_left_click command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:tray:deny-set-show-menu-on-left-click" + ] + }, + { + "description": "core:tray:deny-set-temp-dir-path -> Denies the set_temp_dir_path command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:tray:deny-set-temp-dir-path" + ] + }, + { + "description": "core:tray:deny-set-title -> Denies the set_title command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:tray:deny-set-title" + ] + }, + { + "description": "core:tray:deny-set-tooltip -> Denies the set_tooltip command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:tray:deny-set-tooltip" + ] + }, + { + "description": "core:tray:deny-set-visible -> Denies the set_visible command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:tray:deny-set-visible" + ] + }, + { + "description": "core:webview:default -> Default permissions for the plugin.", + "type": "string", + "enum": [ + "core:webview:default" + ] + }, + { + "description": "core:webview:allow-create-webview -> Enables the create_webview command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:webview:allow-create-webview" + ] + }, + { + "description": "core:webview:allow-create-webview-window -> Enables the create_webview_window command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:webview:allow-create-webview-window" + ] + }, + { + "description": "core:webview:allow-get-all-webviews -> Enables the get_all_webviews command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:webview:allow-get-all-webviews" + ] + }, + { + "description": "core:webview:allow-internal-toggle-devtools -> Enables the internal_toggle_devtools command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:webview:allow-internal-toggle-devtools" + ] + }, + { + "description": "core:webview:allow-print -> Enables the print command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:webview:allow-print" + ] + }, + { + "description": "core:webview:allow-reparent -> Enables the reparent command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:webview:allow-reparent" + ] + }, + { + "description": "core:webview:allow-set-webview-focus -> Enables the set_webview_focus command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:webview:allow-set-webview-focus" + ] + }, + { + "description": "core:webview:allow-set-webview-position -> Enables the set_webview_position command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:webview:allow-set-webview-position" + ] + }, + { + "description": "core:webview:allow-set-webview-size -> Enables the set_webview_size command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:webview:allow-set-webview-size" + ] + }, + { + "description": "core:webview:allow-set-webview-zoom -> Enables the set_webview_zoom command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:webview:allow-set-webview-zoom" + ] + }, + { + "description": "core:webview:allow-webview-close -> Enables the webview_close command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:webview:allow-webview-close" + ] + }, + { + "description": "core:webview:allow-webview-position -> Enables the webview_position command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:webview:allow-webview-position" + ] + }, + { + "description": "core:webview:allow-webview-size -> Enables the webview_size command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:webview:allow-webview-size" + ] + }, + { + "description": "core:webview:deny-create-webview -> Denies the create_webview command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:webview:deny-create-webview" + ] + }, + { + "description": "core:webview:deny-create-webview-window -> Denies the create_webview_window command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:webview:deny-create-webview-window" + ] + }, + { + "description": "core:webview:deny-get-all-webviews -> Denies the get_all_webviews command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:webview:deny-get-all-webviews" + ] + }, + { + "description": "core:webview:deny-internal-toggle-devtools -> Denies the internal_toggle_devtools command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:webview:deny-internal-toggle-devtools" + ] + }, + { + "description": "core:webview:deny-print -> Denies the print command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:webview:deny-print" + ] + }, + { + "description": "core:webview:deny-reparent -> Denies the reparent command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:webview:deny-reparent" + ] + }, + { + "description": "core:webview:deny-set-webview-focus -> Denies the set_webview_focus command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:webview:deny-set-webview-focus" + ] + }, + { + "description": "core:webview:deny-set-webview-position -> Denies the set_webview_position command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:webview:deny-set-webview-position" + ] + }, + { + "description": "core:webview:deny-set-webview-size -> Denies the set_webview_size command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:webview:deny-set-webview-size" + ] + }, + { + "description": "core:webview:deny-set-webview-zoom -> Denies the set_webview_zoom command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:webview:deny-set-webview-zoom" + ] + }, + { + "description": "core:webview:deny-webview-close -> Denies the webview_close command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:webview:deny-webview-close" + ] + }, + { + "description": "core:webview:deny-webview-position -> Denies the webview_position command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:webview:deny-webview-position" + ] + }, + { + "description": "core:webview:deny-webview-size -> Denies the webview_size command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:webview:deny-webview-size" + ] + }, + { + "description": "core:window:default -> Default permissions for the plugin.", + "type": "string", + "enum": [ + "core:window:default" + ] + }, + { + "description": "core:window:allow-available-monitors -> Enables the available_monitors command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:allow-available-monitors" + ] + }, + { + "description": "core:window:allow-center -> Enables the center command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:allow-center" + ] + }, + { + "description": "core:window:allow-close -> Enables the close command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:allow-close" + ] + }, + { + "description": "core:window:allow-create -> Enables the create command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:allow-create" + ] + }, + { + "description": "core:window:allow-current-monitor -> Enables the current_monitor command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:allow-current-monitor" + ] + }, + { + "description": "core:window:allow-cursor-position -> Enables the cursor_position command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:allow-cursor-position" + ] + }, + { + "description": "core:window:allow-destroy -> Enables the destroy command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:allow-destroy" + ] + }, + { + "description": "core:window:allow-get-all-windows -> Enables the get_all_windows command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:allow-get-all-windows" + ] + }, + { + "description": "core:window:allow-hide -> Enables the hide command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:allow-hide" + ] + }, + { + "description": "core:window:allow-inner-position -> Enables the inner_position command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:allow-inner-position" + ] + }, + { + "description": "core:window:allow-inner-size -> Enables the inner_size command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:allow-inner-size" + ] + }, + { + "description": "core:window:allow-internal-toggle-maximize -> Enables the internal_toggle_maximize command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:allow-internal-toggle-maximize" + ] + }, + { + "description": "core:window:allow-is-closable -> Enables the is_closable command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:allow-is-closable" + ] + }, + { + "description": "core:window:allow-is-decorated -> Enables the is_decorated command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:allow-is-decorated" + ] + }, + { + "description": "core:window:allow-is-focused -> Enables the is_focused command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:allow-is-focused" + ] + }, + { + "description": "core:window:allow-is-fullscreen -> Enables the is_fullscreen command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:allow-is-fullscreen" + ] + }, + { + "description": "core:window:allow-is-maximizable -> Enables the is_maximizable command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:allow-is-maximizable" + ] + }, + { + "description": "core:window:allow-is-maximized -> Enables the is_maximized command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:allow-is-maximized" + ] + }, + { + "description": "core:window:allow-is-minimizable -> Enables the is_minimizable command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:allow-is-minimizable" + ] + }, + { + "description": "core:window:allow-is-minimized -> Enables the is_minimized command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:allow-is-minimized" + ] + }, + { + "description": "core:window:allow-is-resizable -> Enables the is_resizable command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:allow-is-resizable" + ] + }, + { + "description": "core:window:allow-is-visible -> Enables the is_visible command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:allow-is-visible" + ] + }, + { + "description": "core:window:allow-maximize -> Enables the maximize command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:allow-maximize" + ] + }, + { + "description": "core:window:allow-minimize -> Enables the minimize command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:allow-minimize" + ] + }, + { + "description": "core:window:allow-monitor-from-point -> Enables the monitor_from_point command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:allow-monitor-from-point" + ] + }, + { + "description": "core:window:allow-outer-position -> Enables the outer_position command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:allow-outer-position" + ] + }, + { + "description": "core:window:allow-outer-size -> Enables the outer_size command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:allow-outer-size" + ] + }, + { + "description": "core:window:allow-primary-monitor -> Enables the primary_monitor command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:allow-primary-monitor" + ] + }, + { + "description": "core:window:allow-request-user-attention -> Enables the request_user_attention command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:allow-request-user-attention" + ] + }, + { + "description": "core:window:allow-scale-factor -> Enables the scale_factor command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:allow-scale-factor" + ] + }, + { + "description": "core:window:allow-set-always-on-bottom -> Enables the set_always_on_bottom command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:allow-set-always-on-bottom" + ] + }, + { + "description": "core:window:allow-set-always-on-top -> Enables the set_always_on_top command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:allow-set-always-on-top" + ] + }, + { + "description": "core:window:allow-set-closable -> Enables the set_closable command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:allow-set-closable" + ] + }, + { + "description": "core:window:allow-set-content-protected -> Enables the set_content_protected command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:allow-set-content-protected" + ] + }, + { + "description": "core:window:allow-set-cursor-grab -> Enables the set_cursor_grab command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:allow-set-cursor-grab" + ] + }, + { + "description": "core:window:allow-set-cursor-icon -> Enables the set_cursor_icon command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:allow-set-cursor-icon" + ] + }, + { + "description": "core:window:allow-set-cursor-position -> Enables the set_cursor_position command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:allow-set-cursor-position" + ] + }, + { + "description": "core:window:allow-set-cursor-visible -> Enables the set_cursor_visible command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:allow-set-cursor-visible" + ] + }, + { + "description": "core:window:allow-set-decorations -> Enables the set_decorations command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:allow-set-decorations" + ] + }, + { + "description": "core:window:allow-set-effects -> Enables the set_effects command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:allow-set-effects" + ] + }, + { + "description": "core:window:allow-set-focus -> Enables the set_focus command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:allow-set-focus" + ] + }, + { + "description": "core:window:allow-set-fullscreen -> Enables the set_fullscreen command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:allow-set-fullscreen" + ] + }, + { + "description": "core:window:allow-set-icon -> Enables the set_icon command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:allow-set-icon" + ] + }, + { + "description": "core:window:allow-set-ignore-cursor-events -> Enables the set_ignore_cursor_events command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:allow-set-ignore-cursor-events" + ] + }, + { + "description": "core:window:allow-set-max-size -> Enables the set_max_size command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:allow-set-max-size" + ] + }, + { + "description": "core:window:allow-set-maximizable -> Enables the set_maximizable command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:allow-set-maximizable" + ] + }, + { + "description": "core:window:allow-set-min-size -> Enables the set_min_size command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:allow-set-min-size" + ] + }, + { + "description": "core:window:allow-set-minimizable -> Enables the set_minimizable command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:allow-set-minimizable" + ] + }, + { + "description": "core:window:allow-set-position -> Enables the set_position command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:allow-set-position" + ] + }, + { + "description": "core:window:allow-set-progress-bar -> Enables the set_progress_bar command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:allow-set-progress-bar" + ] + }, + { + "description": "core:window:allow-set-resizable -> Enables the set_resizable command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:allow-set-resizable" + ] + }, + { + "description": "core:window:allow-set-shadow -> Enables the set_shadow command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:allow-set-shadow" + ] + }, + { + "description": "core:window:allow-set-size -> Enables the set_size command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:allow-set-size" + ] + }, + { + "description": "core:window:allow-set-size-constraints -> Enables the set_size_constraints command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:allow-set-size-constraints" + ] + }, + { + "description": "core:window:allow-set-skip-taskbar -> Enables the set_skip_taskbar command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:allow-set-skip-taskbar" + ] + }, + { + "description": "core:window:allow-set-title -> Enables the set_title command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:allow-set-title" + ] + }, + { + "description": "core:window:allow-set-title-bar-style -> Enables the set_title_bar_style command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:allow-set-title-bar-style" + ] + }, + { + "description": "core:window:allow-set-visible-on-all-workspaces -> Enables the set_visible_on_all_workspaces command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:allow-set-visible-on-all-workspaces" + ] + }, + { + "description": "core:window:allow-show -> Enables the show command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:allow-show" + ] + }, + { + "description": "core:window:allow-start-dragging -> Enables the start_dragging command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:allow-start-dragging" + ] + }, + { + "description": "core:window:allow-start-resize-dragging -> Enables the start_resize_dragging command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:allow-start-resize-dragging" + ] + }, + { + "description": "core:window:allow-theme -> Enables the theme command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:allow-theme" + ] + }, + { + "description": "core:window:allow-title -> Enables the title command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:allow-title" + ] + }, + { + "description": "core:window:allow-toggle-maximize -> Enables the toggle_maximize command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:allow-toggle-maximize" + ] + }, + { + "description": "core:window:allow-unmaximize -> Enables the unmaximize command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:allow-unmaximize" + ] + }, + { + "description": "core:window:allow-unminimize -> Enables the unminimize command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:allow-unminimize" + ] + }, + { + "description": "core:window:deny-available-monitors -> Denies the available_monitors command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:deny-available-monitors" + ] + }, + { + "description": "core:window:deny-center -> Denies the center command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:deny-center" + ] + }, + { + "description": "core:window:deny-close -> Denies the close command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:deny-close" + ] + }, + { + "description": "core:window:deny-create -> Denies the create command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:deny-create" + ] + }, + { + "description": "core:window:deny-current-monitor -> Denies the current_monitor command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:deny-current-monitor" + ] + }, + { + "description": "core:window:deny-cursor-position -> Denies the cursor_position command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:deny-cursor-position" + ] + }, + { + "description": "core:window:deny-destroy -> Denies the destroy command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:deny-destroy" + ] + }, + { + "description": "core:window:deny-get-all-windows -> Denies the get_all_windows command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:deny-get-all-windows" + ] + }, + { + "description": "core:window:deny-hide -> Denies the hide command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:deny-hide" + ] + }, + { + "description": "core:window:deny-inner-position -> Denies the inner_position command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:deny-inner-position" + ] + }, + { + "description": "core:window:deny-inner-size -> Denies the inner_size command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:deny-inner-size" + ] + }, + { + "description": "core:window:deny-internal-toggle-maximize -> Denies the internal_toggle_maximize command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:deny-internal-toggle-maximize" + ] + }, + { + "description": "core:window:deny-is-closable -> Denies the is_closable command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:deny-is-closable" + ] + }, + { + "description": "core:window:deny-is-decorated -> Denies the is_decorated command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:deny-is-decorated" + ] + }, + { + "description": "core:window:deny-is-focused -> Denies the is_focused command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:deny-is-focused" + ] + }, + { + "description": "core:window:deny-is-fullscreen -> Denies the is_fullscreen command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:deny-is-fullscreen" + ] + }, + { + "description": "core:window:deny-is-maximizable -> Denies the is_maximizable command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:deny-is-maximizable" + ] + }, + { + "description": "core:window:deny-is-maximized -> Denies the is_maximized command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:deny-is-maximized" + ] + }, + { + "description": "core:window:deny-is-minimizable -> Denies the is_minimizable command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:deny-is-minimizable" + ] + }, + { + "description": "core:window:deny-is-minimized -> Denies the is_minimized command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:deny-is-minimized" + ] + }, + { + "description": "core:window:deny-is-resizable -> Denies the is_resizable command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:deny-is-resizable" + ] + }, + { + "description": "core:window:deny-is-visible -> Denies the is_visible command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:deny-is-visible" + ] + }, + { + "description": "core:window:deny-maximize -> Denies the maximize command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:deny-maximize" + ] + }, + { + "description": "core:window:deny-minimize -> Denies the minimize command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:deny-minimize" + ] + }, + { + "description": "core:window:deny-monitor-from-point -> Denies the monitor_from_point command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:deny-monitor-from-point" + ] + }, + { + "description": "core:window:deny-outer-position -> Denies the outer_position command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:deny-outer-position" + ] + }, + { + "description": "core:window:deny-outer-size -> Denies the outer_size command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:deny-outer-size" + ] + }, + { + "description": "core:window:deny-primary-monitor -> Denies the primary_monitor command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:deny-primary-monitor" + ] + }, + { + "description": "core:window:deny-request-user-attention -> Denies the request_user_attention command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:deny-request-user-attention" + ] + }, + { + "description": "core:window:deny-scale-factor -> Denies the scale_factor command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:deny-scale-factor" + ] + }, + { + "description": "core:window:deny-set-always-on-bottom -> Denies the set_always_on_bottom command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:deny-set-always-on-bottom" + ] + }, + { + "description": "core:window:deny-set-always-on-top -> Denies the set_always_on_top command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:deny-set-always-on-top" + ] + }, + { + "description": "core:window:deny-set-closable -> Denies the set_closable command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:deny-set-closable" + ] + }, + { + "description": "core:window:deny-set-content-protected -> Denies the set_content_protected command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:deny-set-content-protected" + ] + }, + { + "description": "core:window:deny-set-cursor-grab -> Denies the set_cursor_grab command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:deny-set-cursor-grab" + ] + }, + { + "description": "core:window:deny-set-cursor-icon -> Denies the set_cursor_icon command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:deny-set-cursor-icon" + ] + }, + { + "description": "core:window:deny-set-cursor-position -> Denies the set_cursor_position command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:deny-set-cursor-position" + ] + }, + { + "description": "core:window:deny-set-cursor-visible -> Denies the set_cursor_visible command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:deny-set-cursor-visible" + ] + }, + { + "description": "core:window:deny-set-decorations -> Denies the set_decorations command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:deny-set-decorations" + ] + }, + { + "description": "core:window:deny-set-effects -> Denies the set_effects command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:deny-set-effects" + ] + }, + { + "description": "core:window:deny-set-focus -> Denies the set_focus command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:deny-set-focus" + ] + }, + { + "description": "core:window:deny-set-fullscreen -> Denies the set_fullscreen command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:deny-set-fullscreen" + ] + }, + { + "description": "core:window:deny-set-icon -> Denies the set_icon command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:deny-set-icon" + ] + }, + { + "description": "core:window:deny-set-ignore-cursor-events -> Denies the set_ignore_cursor_events command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:deny-set-ignore-cursor-events" + ] + }, + { + "description": "core:window:deny-set-max-size -> Denies the set_max_size command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:deny-set-max-size" + ] + }, + { + "description": "core:window:deny-set-maximizable -> Denies the set_maximizable command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:deny-set-maximizable" + ] + }, + { + "description": "core:window:deny-set-min-size -> Denies the set_min_size command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:deny-set-min-size" + ] + }, + { + "description": "core:window:deny-set-minimizable -> Denies the set_minimizable command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:deny-set-minimizable" + ] + }, + { + "description": "core:window:deny-set-position -> Denies the set_position command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:deny-set-position" + ] + }, + { + "description": "core:window:deny-set-progress-bar -> Denies the set_progress_bar command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:deny-set-progress-bar" + ] + }, + { + "description": "core:window:deny-set-resizable -> Denies the set_resizable command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:deny-set-resizable" + ] + }, + { + "description": "core:window:deny-set-shadow -> Denies the set_shadow command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:deny-set-shadow" + ] + }, + { + "description": "core:window:deny-set-size -> Denies the set_size command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:deny-set-size" + ] + }, + { + "description": "core:window:deny-set-size-constraints -> Denies the set_size_constraints command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:deny-set-size-constraints" + ] + }, + { + "description": "core:window:deny-set-skip-taskbar -> Denies the set_skip_taskbar command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:deny-set-skip-taskbar" + ] + }, + { + "description": "core:window:deny-set-title -> Denies the set_title command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:deny-set-title" + ] + }, + { + "description": "core:window:deny-set-title-bar-style -> Denies the set_title_bar_style command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:deny-set-title-bar-style" + ] + }, + { + "description": "core:window:deny-set-visible-on-all-workspaces -> Denies the set_visible_on_all_workspaces command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:deny-set-visible-on-all-workspaces" + ] + }, + { + "description": "core:window:deny-show -> Denies the show command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:deny-show" + ] + }, + { + "description": "core:window:deny-start-dragging -> Denies the start_dragging command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:deny-start-dragging" + ] + }, + { + "description": "core:window:deny-start-resize-dragging -> Denies the start_resize_dragging command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:deny-start-resize-dragging" + ] + }, + { + "description": "core:window:deny-theme -> Denies the theme command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:deny-theme" + ] + }, + { + "description": "core:window:deny-title -> Denies the title command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:deny-title" + ] + }, + { + "description": "core:window:deny-toggle-maximize -> Denies the toggle_maximize command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:deny-toggle-maximize" + ] + }, + { + "description": "core:window:deny-unmaximize -> Denies the unmaximize command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:deny-unmaximize" + ] + }, + { + "description": "core:window:deny-unminimize -> Denies the unminimize command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:deny-unminimize" + ] + }, + { + "description": "dialog:default -> This permission set configures the types of dialogs\navailable from the dialog plugin.\n\n#### Granted Permissions\n\nAll dialog types are enabled.\n\n\n", + "type": "string", + "enum": [ + "dialog:default" + ] + }, + { + "description": "dialog:allow-ask -> Enables the ask command without any pre-configured scope.", + "type": "string", + "enum": [ + "dialog:allow-ask" + ] + }, + { + "description": "dialog:allow-confirm -> Enables the confirm command without any pre-configured scope.", + "type": "string", + "enum": [ + "dialog:allow-confirm" + ] + }, + { + "description": "dialog:allow-message -> Enables the message command without any pre-configured scope.", + "type": "string", + "enum": [ + "dialog:allow-message" + ] + }, + { + "description": "dialog:allow-open -> Enables the open command without any pre-configured scope.", + "type": "string", + "enum": [ + "dialog:allow-open" + ] + }, + { + "description": "dialog:allow-save -> Enables the save command without any pre-configured scope.", + "type": "string", + "enum": [ + "dialog:allow-save" + ] + }, + { + "description": "dialog:deny-ask -> Denies the ask command without any pre-configured scope.", + "type": "string", + "enum": [ + "dialog:deny-ask" + ] + }, + { + "description": "dialog:deny-confirm -> Denies the confirm command without any pre-configured scope.", + "type": "string", + "enum": [ + "dialog:deny-confirm" + ] + }, + { + "description": "dialog:deny-message -> Denies the message command without any pre-configured scope.", + "type": "string", + "enum": [ + "dialog:deny-message" + ] + }, + { + "description": "dialog:deny-open -> Denies the open command without any pre-configured scope.", + "type": "string", + "enum": [ + "dialog:deny-open" + ] + }, + { + "description": "dialog:deny-save -> Denies the save command without any pre-configured scope.", + "type": "string", + "enum": [ + "dialog:deny-save" + ] + }, + { + "description": "fs:allow-app-meta -> This allows non-recursive read access to metadata of the `$APP` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-app-meta" + ] + }, + { + "description": "fs:allow-app-meta-recursive -> This allows full recursive read access to metadata of the `$APP` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-app-meta-recursive" + ] + }, + { + "description": "fs:allow-app-read -> This allows non-recursive read access to the `$APP` folder.", + "type": "string", + "enum": [ + "fs:allow-app-read" + ] + }, + { + "description": "fs:allow-app-read-recursive -> This allows full recursive read access to the complete `$APP` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-app-read-recursive" + ] + }, + { + "description": "fs:allow-app-write -> This allows non-recursive write access to the `$APP` folder.", + "type": "string", + "enum": [ + "fs:allow-app-write" + ] + }, + { + "description": "fs:allow-app-write-recursive -> This allows full recursive write access to the complete `$APP` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-app-write-recursive" + ] + }, + { + "description": "fs:allow-appcache-meta -> This allows non-recursive read access to metadata of the `$APPCACHE` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-appcache-meta" + ] + }, + { + "description": "fs:allow-appcache-meta-recursive -> This allows full recursive read access to metadata of the `$APPCACHE` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-appcache-meta-recursive" + ] + }, + { + "description": "fs:allow-appcache-read -> This allows non-recursive read access to the `$APPCACHE` folder.", + "type": "string", + "enum": [ + "fs:allow-appcache-read" + ] + }, + { + "description": "fs:allow-appcache-read-recursive -> This allows full recursive read access to the complete `$APPCACHE` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-appcache-read-recursive" + ] + }, + { + "description": "fs:allow-appcache-write -> This allows non-recursive write access to the `$APPCACHE` folder.", + "type": "string", + "enum": [ + "fs:allow-appcache-write" + ] + }, + { + "description": "fs:allow-appcache-write-recursive -> This allows full recursive write access to the complete `$APPCACHE` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-appcache-write-recursive" + ] + }, + { + "description": "fs:allow-appconfig-meta -> This allows non-recursive read access to metadata of the `$APPCONFIG` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-appconfig-meta" + ] + }, + { + "description": "fs:allow-appconfig-meta-recursive -> This allows full recursive read access to metadata of the `$APPCONFIG` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-appconfig-meta-recursive" + ] + }, + { + "description": "fs:allow-appconfig-read -> This allows non-recursive read access to the `$APPCONFIG` folder.", + "type": "string", + "enum": [ + "fs:allow-appconfig-read" + ] + }, + { + "description": "fs:allow-appconfig-read-recursive -> This allows full recursive read access to the complete `$APPCONFIG` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-appconfig-read-recursive" + ] + }, + { + "description": "fs:allow-appconfig-write -> This allows non-recursive write access to the `$APPCONFIG` folder.", + "type": "string", + "enum": [ + "fs:allow-appconfig-write" + ] + }, + { + "description": "fs:allow-appconfig-write-recursive -> This allows full recursive write access to the complete `$APPCONFIG` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-appconfig-write-recursive" + ] + }, + { + "description": "fs:allow-appdata-meta -> This allows non-recursive read access to metadata of the `$APPDATA` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-appdata-meta" + ] + }, + { + "description": "fs:allow-appdata-meta-recursive -> This allows full recursive read access to metadata of the `$APPDATA` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-appdata-meta-recursive" + ] + }, + { + "description": "fs:allow-appdata-read -> This allows non-recursive read access to the `$APPDATA` folder.", + "type": "string", + "enum": [ + "fs:allow-appdata-read" + ] + }, + { + "description": "fs:allow-appdata-read-recursive -> This allows full recursive read access to the complete `$APPDATA` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-appdata-read-recursive" + ] + }, + { + "description": "fs:allow-appdata-write -> This allows non-recursive write access to the `$APPDATA` folder.", + "type": "string", + "enum": [ + "fs:allow-appdata-write" + ] + }, + { + "description": "fs:allow-appdata-write-recursive -> This allows full recursive write access to the complete `$APPDATA` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-appdata-write-recursive" + ] + }, + { + "description": "fs:allow-applocaldata-meta -> This allows non-recursive read access to metadata of the `$APPLOCALDATA` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-applocaldata-meta" + ] + }, + { + "description": "fs:allow-applocaldata-meta-recursive -> This allows full recursive read access to metadata of the `$APPLOCALDATA` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-applocaldata-meta-recursive" + ] + }, + { + "description": "fs:allow-applocaldata-read -> This allows non-recursive read access to the `$APPLOCALDATA` folder.", + "type": "string", + "enum": [ + "fs:allow-applocaldata-read" + ] + }, + { + "description": "fs:allow-applocaldata-read-recursive -> This allows full recursive read access to the complete `$APPLOCALDATA` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-applocaldata-read-recursive" + ] + }, + { + "description": "fs:allow-applocaldata-write -> This allows non-recursive write access to the `$APPLOCALDATA` folder.", + "type": "string", + "enum": [ + "fs:allow-applocaldata-write" + ] + }, + { + "description": "fs:allow-applocaldata-write-recursive -> This allows full recursive write access to the complete `$APPLOCALDATA` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-applocaldata-write-recursive" + ] + }, + { + "description": "fs:allow-applog-meta -> This allows non-recursive read access to metadata of the `$APPLOG` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-applog-meta" + ] + }, + { + "description": "fs:allow-applog-meta-recursive -> This allows full recursive read access to metadata of the `$APPLOG` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-applog-meta-recursive" + ] + }, + { + "description": "fs:allow-applog-read -> This allows non-recursive read access to the `$APPLOG` folder.", + "type": "string", + "enum": [ + "fs:allow-applog-read" + ] + }, + { + "description": "fs:allow-applog-read-recursive -> This allows full recursive read access to the complete `$APPLOG` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-applog-read-recursive" + ] + }, + { + "description": "fs:allow-applog-write -> This allows non-recursive write access to the `$APPLOG` folder.", + "type": "string", + "enum": [ + "fs:allow-applog-write" + ] + }, + { + "description": "fs:allow-applog-write-recursive -> This allows full recursive write access to the complete `$APPLOG` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-applog-write-recursive" + ] + }, + { + "description": "fs:allow-audio-meta -> This allows non-recursive read access to metadata of the `$AUDIO` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-audio-meta" + ] + }, + { + "description": "fs:allow-audio-meta-recursive -> This allows full recursive read access to metadata of the `$AUDIO` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-audio-meta-recursive" + ] + }, + { + "description": "fs:allow-audio-read -> This allows non-recursive read access to the `$AUDIO` folder.", + "type": "string", + "enum": [ + "fs:allow-audio-read" + ] + }, + { + "description": "fs:allow-audio-read-recursive -> This allows full recursive read access to the complete `$AUDIO` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-audio-read-recursive" + ] + }, + { + "description": "fs:allow-audio-write -> This allows non-recursive write access to the `$AUDIO` folder.", + "type": "string", + "enum": [ + "fs:allow-audio-write" + ] + }, + { + "description": "fs:allow-audio-write-recursive -> This allows full recursive write access to the complete `$AUDIO` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-audio-write-recursive" + ] + }, + { + "description": "fs:allow-cache-meta -> This allows non-recursive read access to metadata of the `$CACHE` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-cache-meta" + ] + }, + { + "description": "fs:allow-cache-meta-recursive -> This allows full recursive read access to metadata of the `$CACHE` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-cache-meta-recursive" + ] + }, + { + "description": "fs:allow-cache-read -> This allows non-recursive read access to the `$CACHE` folder.", + "type": "string", + "enum": [ + "fs:allow-cache-read" + ] + }, + { + "description": "fs:allow-cache-read-recursive -> This allows full recursive read access to the complete `$CACHE` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-cache-read-recursive" + ] + }, + { + "description": "fs:allow-cache-write -> This allows non-recursive write access to the `$CACHE` folder.", + "type": "string", + "enum": [ + "fs:allow-cache-write" + ] + }, + { + "description": "fs:allow-cache-write-recursive -> This allows full recursive write access to the complete `$CACHE` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-cache-write-recursive" + ] + }, + { + "description": "fs:allow-config-meta -> This allows non-recursive read access to metadata of the `$CONFIG` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-config-meta" + ] + }, + { + "description": "fs:allow-config-meta-recursive -> This allows full recursive read access to metadata of the `$CONFIG` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-config-meta-recursive" + ] + }, + { + "description": "fs:allow-config-read -> This allows non-recursive read access to the `$CONFIG` folder.", + "type": "string", + "enum": [ + "fs:allow-config-read" + ] + }, + { + "description": "fs:allow-config-read-recursive -> This allows full recursive read access to the complete `$CONFIG` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-config-read-recursive" + ] + }, + { + "description": "fs:allow-config-write -> This allows non-recursive write access to the `$CONFIG` folder.", + "type": "string", + "enum": [ + "fs:allow-config-write" + ] + }, + { + "description": "fs:allow-config-write-recursive -> This allows full recursive write access to the complete `$CONFIG` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-config-write-recursive" + ] + }, + { + "description": "fs:allow-data-meta -> This allows non-recursive read access to metadata of the `$DATA` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-data-meta" + ] + }, + { + "description": "fs:allow-data-meta-recursive -> This allows full recursive read access to metadata of the `$DATA` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-data-meta-recursive" + ] + }, + { + "description": "fs:allow-data-read -> This allows non-recursive read access to the `$DATA` folder.", + "type": "string", + "enum": [ + "fs:allow-data-read" + ] + }, + { + "description": "fs:allow-data-read-recursive -> This allows full recursive read access to the complete `$DATA` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-data-read-recursive" + ] + }, + { + "description": "fs:allow-data-write -> This allows non-recursive write access to the `$DATA` folder.", + "type": "string", + "enum": [ + "fs:allow-data-write" + ] + }, + { + "description": "fs:allow-data-write-recursive -> This allows full recursive write access to the complete `$DATA` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-data-write-recursive" + ] + }, + { + "description": "fs:allow-desktop-meta -> This allows non-recursive read access to metadata of the `$DESKTOP` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-desktop-meta" + ] + }, + { + "description": "fs:allow-desktop-meta-recursive -> This allows full recursive read access to metadata of the `$DESKTOP` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-desktop-meta-recursive" + ] + }, + { + "description": "fs:allow-desktop-read -> This allows non-recursive read access to the `$DESKTOP` folder.", + "type": "string", + "enum": [ + "fs:allow-desktop-read" + ] + }, + { + "description": "fs:allow-desktop-read-recursive -> This allows full recursive read access to the complete `$DESKTOP` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-desktop-read-recursive" + ] + }, + { + "description": "fs:allow-desktop-write -> This allows non-recursive write access to the `$DESKTOP` folder.", + "type": "string", + "enum": [ + "fs:allow-desktop-write" + ] + }, + { + "description": "fs:allow-desktop-write-recursive -> This allows full recursive write access to the complete `$DESKTOP` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-desktop-write-recursive" + ] + }, + { + "description": "fs:allow-document-meta -> This allows non-recursive read access to metadata of the `$DOCUMENT` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-document-meta" + ] + }, + { + "description": "fs:allow-document-meta-recursive -> This allows full recursive read access to metadata of the `$DOCUMENT` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-document-meta-recursive" + ] + }, + { + "description": "fs:allow-document-read -> This allows non-recursive read access to the `$DOCUMENT` folder.", + "type": "string", + "enum": [ + "fs:allow-document-read" + ] + }, + { + "description": "fs:allow-document-read-recursive -> This allows full recursive read access to the complete `$DOCUMENT` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-document-read-recursive" + ] + }, + { + "description": "fs:allow-document-write -> This allows non-recursive write access to the `$DOCUMENT` folder.", + "type": "string", + "enum": [ + "fs:allow-document-write" + ] + }, + { + "description": "fs:allow-document-write-recursive -> This allows full recursive write access to the complete `$DOCUMENT` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-document-write-recursive" + ] + }, + { + "description": "fs:allow-download-meta -> This allows non-recursive read access to metadata of the `$DOWNLOAD` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-download-meta" + ] + }, + { + "description": "fs:allow-download-meta-recursive -> This allows full recursive read access to metadata of the `$DOWNLOAD` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-download-meta-recursive" + ] + }, + { + "description": "fs:allow-download-read -> This allows non-recursive read access to the `$DOWNLOAD` folder.", + "type": "string", + "enum": [ + "fs:allow-download-read" + ] + }, + { + "description": "fs:allow-download-read-recursive -> This allows full recursive read access to the complete `$DOWNLOAD` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-download-read-recursive" + ] + }, + { + "description": "fs:allow-download-write -> This allows non-recursive write access to the `$DOWNLOAD` folder.", + "type": "string", + "enum": [ + "fs:allow-download-write" + ] + }, + { + "description": "fs:allow-download-write-recursive -> This allows full recursive write access to the complete `$DOWNLOAD` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-download-write-recursive" + ] + }, + { + "description": "fs:allow-exe-meta -> This allows non-recursive read access to metadata of the `$EXE` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-exe-meta" + ] + }, + { + "description": "fs:allow-exe-meta-recursive -> This allows full recursive read access to metadata of the `$EXE` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-exe-meta-recursive" + ] + }, + { + "description": "fs:allow-exe-read -> This allows non-recursive read access to the `$EXE` folder.", + "type": "string", + "enum": [ + "fs:allow-exe-read" + ] + }, + { + "description": "fs:allow-exe-read-recursive -> This allows full recursive read access to the complete `$EXE` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-exe-read-recursive" + ] + }, + { + "description": "fs:allow-exe-write -> This allows non-recursive write access to the `$EXE` folder.", + "type": "string", + "enum": [ + "fs:allow-exe-write" + ] + }, + { + "description": "fs:allow-exe-write-recursive -> This allows full recursive write access to the complete `$EXE` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-exe-write-recursive" + ] + }, + { + "description": "fs:allow-font-meta -> This allows non-recursive read access to metadata of the `$FONT` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-font-meta" + ] + }, + { + "description": "fs:allow-font-meta-recursive -> This allows full recursive read access to metadata of the `$FONT` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-font-meta-recursive" + ] + }, + { + "description": "fs:allow-font-read -> This allows non-recursive read access to the `$FONT` folder.", + "type": "string", + "enum": [ + "fs:allow-font-read" + ] + }, + { + "description": "fs:allow-font-read-recursive -> This allows full recursive read access to the complete `$FONT` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-font-read-recursive" + ] + }, + { + "description": "fs:allow-font-write -> This allows non-recursive write access to the `$FONT` folder.", + "type": "string", + "enum": [ + "fs:allow-font-write" + ] + }, + { + "description": "fs:allow-font-write-recursive -> This allows full recursive write access to the complete `$FONT` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-font-write-recursive" + ] + }, + { + "description": "fs:allow-home-meta -> This allows non-recursive read access to metadata of the `$HOME` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-home-meta" + ] + }, + { + "description": "fs:allow-home-meta-recursive -> This allows full recursive read access to metadata of the `$HOME` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-home-meta-recursive" + ] + }, + { + "description": "fs:allow-home-read -> This allows non-recursive read access to the `$HOME` folder.", + "type": "string", + "enum": [ + "fs:allow-home-read" + ] + }, + { + "description": "fs:allow-home-read-recursive -> This allows full recursive read access to the complete `$HOME` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-home-read-recursive" + ] + }, + { + "description": "fs:allow-home-write -> This allows non-recursive write access to the `$HOME` folder.", + "type": "string", + "enum": [ + "fs:allow-home-write" + ] + }, + { + "description": "fs:allow-home-write-recursive -> This allows full recursive write access to the complete `$HOME` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-home-write-recursive" + ] + }, + { + "description": "fs:allow-localdata-meta -> This allows non-recursive read access to metadata of the `$LOCALDATA` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-localdata-meta" + ] + }, + { + "description": "fs:allow-localdata-meta-recursive -> This allows full recursive read access to metadata of the `$LOCALDATA` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-localdata-meta-recursive" + ] + }, + { + "description": "fs:allow-localdata-read -> This allows non-recursive read access to the `$LOCALDATA` folder.", + "type": "string", + "enum": [ + "fs:allow-localdata-read" + ] + }, + { + "description": "fs:allow-localdata-read-recursive -> This allows full recursive read access to the complete `$LOCALDATA` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-localdata-read-recursive" + ] + }, + { + "description": "fs:allow-localdata-write -> This allows non-recursive write access to the `$LOCALDATA` folder.", + "type": "string", + "enum": [ + "fs:allow-localdata-write" + ] + }, + { + "description": "fs:allow-localdata-write-recursive -> This allows full recursive write access to the complete `$LOCALDATA` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-localdata-write-recursive" + ] + }, + { + "description": "fs:allow-log-meta -> This allows non-recursive read access to metadata of the `$LOG` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-log-meta" + ] + }, + { + "description": "fs:allow-log-meta-recursive -> This allows full recursive read access to metadata of the `$LOG` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-log-meta-recursive" + ] + }, + { + "description": "fs:allow-log-read -> This allows non-recursive read access to the `$LOG` folder.", + "type": "string", + "enum": [ + "fs:allow-log-read" + ] + }, + { + "description": "fs:allow-log-read-recursive -> This allows full recursive read access to the complete `$LOG` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-log-read-recursive" + ] + }, + { + "description": "fs:allow-log-write -> This allows non-recursive write access to the `$LOG` folder.", + "type": "string", + "enum": [ + "fs:allow-log-write" + ] + }, + { + "description": "fs:allow-log-write-recursive -> This allows full recursive write access to the complete `$LOG` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-log-write-recursive" + ] + }, + { + "description": "fs:allow-picture-meta -> This allows non-recursive read access to metadata of the `$PICTURE` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-picture-meta" + ] + }, + { + "description": "fs:allow-picture-meta-recursive -> This allows full recursive read access to metadata of the `$PICTURE` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-picture-meta-recursive" + ] + }, + { + "description": "fs:allow-picture-read -> This allows non-recursive read access to the `$PICTURE` folder.", + "type": "string", + "enum": [ + "fs:allow-picture-read" + ] + }, + { + "description": "fs:allow-picture-read-recursive -> This allows full recursive read access to the complete `$PICTURE` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-picture-read-recursive" + ] + }, + { + "description": "fs:allow-picture-write -> This allows non-recursive write access to the `$PICTURE` folder.", + "type": "string", + "enum": [ + "fs:allow-picture-write" + ] + }, + { + "description": "fs:allow-picture-write-recursive -> This allows full recursive write access to the complete `$PICTURE` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-picture-write-recursive" + ] + }, + { + "description": "fs:allow-public-meta -> This allows non-recursive read access to metadata of the `$PUBLIC` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-public-meta" + ] + }, + { + "description": "fs:allow-public-meta-recursive -> This allows full recursive read access to metadata of the `$PUBLIC` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-public-meta-recursive" + ] + }, + { + "description": "fs:allow-public-read -> This allows non-recursive read access to the `$PUBLIC` folder.", + "type": "string", + "enum": [ + "fs:allow-public-read" + ] + }, + { + "description": "fs:allow-public-read-recursive -> This allows full recursive read access to the complete `$PUBLIC` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-public-read-recursive" + ] + }, + { + "description": "fs:allow-public-write -> This allows non-recursive write access to the `$PUBLIC` folder.", + "type": "string", + "enum": [ + "fs:allow-public-write" + ] + }, + { + "description": "fs:allow-public-write-recursive -> This allows full recursive write access to the complete `$PUBLIC` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-public-write-recursive" + ] + }, + { + "description": "fs:allow-resource-meta -> This allows non-recursive read access to metadata of the `$RESOURCE` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-resource-meta" + ] + }, + { + "description": "fs:allow-resource-meta-recursive -> This allows full recursive read access to metadata of the `$RESOURCE` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-resource-meta-recursive" + ] + }, + { + "description": "fs:allow-resource-read -> This allows non-recursive read access to the `$RESOURCE` folder.", + "type": "string", + "enum": [ + "fs:allow-resource-read" + ] + }, + { + "description": "fs:allow-resource-read-recursive -> This allows full recursive read access to the complete `$RESOURCE` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-resource-read-recursive" + ] + }, + { + "description": "fs:allow-resource-write -> This allows non-recursive write access to the `$RESOURCE` folder.", + "type": "string", + "enum": [ + "fs:allow-resource-write" + ] + }, + { + "description": "fs:allow-resource-write-recursive -> This allows full recursive write access to the complete `$RESOURCE` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-resource-write-recursive" + ] + }, + { + "description": "fs:allow-runtime-meta -> This allows non-recursive read access to metadata of the `$RUNTIME` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-runtime-meta" + ] + }, + { + "description": "fs:allow-runtime-meta-recursive -> This allows full recursive read access to metadata of the `$RUNTIME` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-runtime-meta-recursive" + ] + }, + { + "description": "fs:allow-runtime-read -> This allows non-recursive read access to the `$RUNTIME` folder.", + "type": "string", + "enum": [ + "fs:allow-runtime-read" + ] + }, + { + "description": "fs:allow-runtime-read-recursive -> This allows full recursive read access to the complete `$RUNTIME` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-runtime-read-recursive" + ] + }, + { + "description": "fs:allow-runtime-write -> This allows non-recursive write access to the `$RUNTIME` folder.", + "type": "string", + "enum": [ + "fs:allow-runtime-write" + ] + }, + { + "description": "fs:allow-runtime-write-recursive -> This allows full recursive write access to the complete `$RUNTIME` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-runtime-write-recursive" + ] + }, + { + "description": "fs:allow-temp-meta -> This allows non-recursive read access to metadata of the `$TEMP` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-temp-meta" + ] + }, + { + "description": "fs:allow-temp-meta-recursive -> This allows full recursive read access to metadata of the `$TEMP` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-temp-meta-recursive" + ] + }, + { + "description": "fs:allow-temp-read -> This allows non-recursive read access to the `$TEMP` folder.", + "type": "string", + "enum": [ + "fs:allow-temp-read" + ] + }, + { + "description": "fs:allow-temp-read-recursive -> This allows full recursive read access to the complete `$TEMP` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-temp-read-recursive" + ] + }, + { + "description": "fs:allow-temp-write -> This allows non-recursive write access to the `$TEMP` folder.", + "type": "string", + "enum": [ + "fs:allow-temp-write" + ] + }, + { + "description": "fs:allow-temp-write-recursive -> This allows full recursive write access to the complete `$TEMP` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-temp-write-recursive" + ] + }, + { + "description": "fs:allow-template-meta -> This allows non-recursive read access to metadata of the `$TEMPLATE` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-template-meta" + ] + }, + { + "description": "fs:allow-template-meta-recursive -> This allows full recursive read access to metadata of the `$TEMPLATE` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-template-meta-recursive" + ] + }, + { + "description": "fs:allow-template-read -> This allows non-recursive read access to the `$TEMPLATE` folder.", + "type": "string", + "enum": [ + "fs:allow-template-read" + ] + }, + { + "description": "fs:allow-template-read-recursive -> This allows full recursive read access to the complete `$TEMPLATE` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-template-read-recursive" + ] + }, + { + "description": "fs:allow-template-write -> This allows non-recursive write access to the `$TEMPLATE` folder.", + "type": "string", + "enum": [ + "fs:allow-template-write" + ] + }, + { + "description": "fs:allow-template-write-recursive -> This allows full recursive write access to the complete `$TEMPLATE` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-template-write-recursive" + ] + }, + { + "description": "fs:allow-video-meta -> This allows non-recursive read access to metadata of the `$VIDEO` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-video-meta" + ] + }, + { + "description": "fs:allow-video-meta-recursive -> This allows full recursive read access to metadata of the `$VIDEO` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-video-meta-recursive" + ] + }, + { + "description": "fs:allow-video-read -> This allows non-recursive read access to the `$VIDEO` folder.", + "type": "string", + "enum": [ + "fs:allow-video-read" + ] + }, + { + "description": "fs:allow-video-read-recursive -> This allows full recursive read access to the complete `$VIDEO` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-video-read-recursive" + ] + }, + { + "description": "fs:allow-video-write -> This allows non-recursive write access to the `$VIDEO` folder.", + "type": "string", + "enum": [ + "fs:allow-video-write" + ] + }, + { + "description": "fs:allow-video-write-recursive -> This allows full recursive write access to the complete `$VIDEO` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-video-write-recursive" + ] + }, + { + "description": "fs:deny-default -> This denies access to dangerous Tauri relevant files and folders by default.", + "type": "string", + "enum": [ + "fs:deny-default" + ] + }, + { + "description": "fs:default -> This set of permissions describes the what kind of\nfile system access the `fs` plugin has enabled or denied by default.\n\n#### Granted Permissions\n\nThis default permission set enables read access to the\napplication specific directories (AppConfig, AppData, AppLocalData, AppCache,\nAppLog) and all files and sub directories created in it.\nThe location of these directories depends on the operating system,\nwhere the application is run.\n\nIn general these directories need to be manually created\nby the application at runtime, before accessing files or folders\nin it is possible.\n\nTherefore, it is also allowed to create all of these folders via\nthe `mkdir` command.\n\n#### Denied Permissions\n\nThis default permission set prevents access to critical components\nof the Tauri application by default.\nOn Windows the webview data folder access is denied.\n\n", + "type": "string", + "enum": [ + "fs:default" + ] + }, + { + "description": "fs:allow-copy-file -> Enables the copy_file command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:allow-copy-file" + ] + }, + { + "description": "fs:allow-create -> Enables the create command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:allow-create" + ] + }, + { + "description": "fs:allow-exists -> Enables the exists command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:allow-exists" + ] + }, + { + "description": "fs:allow-fstat -> Enables the fstat command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:allow-fstat" + ] + }, + { + "description": "fs:allow-ftruncate -> Enables the ftruncate command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:allow-ftruncate" + ] + }, + { + "description": "fs:allow-lstat -> Enables the lstat command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:allow-lstat" + ] + }, + { + "description": "fs:allow-mkdir -> Enables the mkdir command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:allow-mkdir" + ] + }, + { + "description": "fs:allow-open -> Enables the open command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:allow-open" + ] + }, + { + "description": "fs:allow-read -> Enables the read command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:allow-read" + ] + }, + { + "description": "fs:allow-read-dir -> Enables the read_dir command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:allow-read-dir" + ] + }, + { + "description": "fs:allow-read-file -> Enables the read_file command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:allow-read-file" + ] + }, + { + "description": "fs:allow-read-text-file -> Enables the read_text_file command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:allow-read-text-file" + ] + }, + { + "description": "fs:allow-read-text-file-lines -> Enables the read_text_file_lines command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:allow-read-text-file-lines" + ] + }, + { + "description": "fs:allow-read-text-file-lines-next -> Enables the read_text_file_lines_next command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:allow-read-text-file-lines-next" + ] + }, + { + "description": "fs:allow-remove -> Enables the remove command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:allow-remove" + ] + }, + { + "description": "fs:allow-rename -> Enables the rename command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:allow-rename" + ] + }, + { + "description": "fs:allow-seek -> Enables the seek command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:allow-seek" + ] + }, + { + "description": "fs:allow-stat -> Enables the stat command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:allow-stat" + ] + }, + { + "description": "fs:allow-truncate -> Enables the truncate command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:allow-truncate" + ] + }, + { + "description": "fs:allow-unwatch -> Enables the unwatch command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:allow-unwatch" + ] + }, + { + "description": "fs:allow-watch -> Enables the watch command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:allow-watch" + ] + }, + { + "description": "fs:allow-write -> Enables the write command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:allow-write" + ] + }, + { + "description": "fs:allow-write-file -> Enables the write_file command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:allow-write-file" + ] + }, + { + "description": "fs:allow-write-text-file -> Enables the write_text_file command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:allow-write-text-file" + ] + }, + { + "description": "fs:create-app-specific-dirs -> This permissions allows to create the application specific directories.\n", + "type": "string", + "enum": [ + "fs:create-app-specific-dirs" + ] + }, + { + "description": "fs:deny-copy-file -> Denies the copy_file command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:deny-copy-file" + ] + }, + { + "description": "fs:deny-create -> Denies the create command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:deny-create" + ] + }, + { + "description": "fs:deny-exists -> Denies the exists command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:deny-exists" + ] + }, + { + "description": "fs:deny-fstat -> Denies the fstat command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:deny-fstat" + ] + }, + { + "description": "fs:deny-ftruncate -> Denies the ftruncate command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:deny-ftruncate" + ] + }, + { + "description": "fs:deny-lstat -> Denies the lstat command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:deny-lstat" + ] + }, + { + "description": "fs:deny-mkdir -> Denies the mkdir command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:deny-mkdir" + ] + }, + { + "description": "fs:deny-open -> Denies the open command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:deny-open" + ] + }, + { + "description": "fs:deny-read -> Denies the read command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:deny-read" + ] + }, + { + "description": "fs:deny-read-dir -> Denies the read_dir command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:deny-read-dir" + ] + }, + { + "description": "fs:deny-read-file -> Denies the read_file command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:deny-read-file" + ] + }, + { + "description": "fs:deny-read-text-file -> Denies the read_text_file command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:deny-read-text-file" + ] + }, + { + "description": "fs:deny-read-text-file-lines -> Denies the read_text_file_lines command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:deny-read-text-file-lines" + ] + }, + { + "description": "fs:deny-read-text-file-lines-next -> Denies the read_text_file_lines_next command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:deny-read-text-file-lines-next" + ] + }, + { + "description": "fs:deny-remove -> Denies the remove command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:deny-remove" + ] + }, + { + "description": "fs:deny-rename -> Denies the rename command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:deny-rename" + ] + }, + { + "description": "fs:deny-seek -> Denies the seek command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:deny-seek" + ] + }, + { + "description": "fs:deny-stat -> Denies the stat command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:deny-stat" + ] + }, + { + "description": "fs:deny-truncate -> Denies the truncate command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:deny-truncate" + ] + }, + { + "description": "fs:deny-unwatch -> Denies the unwatch command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:deny-unwatch" + ] + }, + { + "description": "fs:deny-watch -> Denies the watch command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:deny-watch" + ] + }, + { + "description": "fs:deny-webview-data-linux -> This denies read access to the\n`$APPLOCALDATA` folder on linux as the webview data and configuration values are stored here.\nAllowing access can lead to sensitive information disclosure and should be well considered.", + "type": "string", + "enum": [ + "fs:deny-webview-data-linux" + ] + }, + { + "description": "fs:deny-webview-data-windows -> This denies read access to the\n`$APPLOCALDATA/EBWebView` folder on windows as the webview data and configuration values are stored here.\nAllowing access can lead to sensitive information disclosure and should be well considered.", + "type": "string", + "enum": [ + "fs:deny-webview-data-windows" + ] + }, + { + "description": "fs:deny-write -> Denies the write command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:deny-write" + ] + }, + { + "description": "fs:deny-write-file -> Denies the write_file command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:deny-write-file" + ] + }, + { + "description": "fs:deny-write-text-file -> Denies the write_text_file command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:deny-write-text-file" + ] + }, + { + "description": "fs:read-all -> This enables all read related commands without any pre-configured accessible paths.", + "type": "string", + "enum": [ + "fs:read-all" + ] + }, + { + "description": "fs:read-app-specific-dirs-recursive -> This permission allows recursive read functionality on the application\nspecific base directories. \n", + "type": "string", + "enum": [ + "fs:read-app-specific-dirs-recursive" + ] + }, + { + "description": "fs:read-dirs -> This enables directory read and file metadata related commands without any pre-configured accessible paths.", + "type": "string", + "enum": [ + "fs:read-dirs" + ] + }, + { + "description": "fs:read-files -> This enables file read related commands without any pre-configured accessible paths.", + "type": "string", + "enum": [ + "fs:read-files" + ] + }, + { + "description": "fs:read-meta -> This enables all index or metadata related commands without any pre-configured accessible paths.", + "type": "string", + "enum": [ + "fs:read-meta" + ] + }, + { + "description": "fs:scope -> An empty permission you can use to modify the global scope.", + "type": "string", + "enum": [ + "fs:scope" + ] + }, + { + "description": "fs:scope-app -> This scope permits access to all files and list content of top level directories in the `$APP`folder.", + "type": "string", + "enum": [ + "fs:scope-app" + ] + }, + { + "description": "fs:scope-app-index -> This scope permits to list all files and folders in the `$APP`folder.", + "type": "string", + "enum": [ + "fs:scope-app-index" + ] + }, + { + "description": "fs:scope-app-recursive -> This scope permits recursive access to the complete `$APP` folder, including sub directories and files.", + "type": "string", + "enum": [ + "fs:scope-app-recursive" + ] + }, + { + "description": "fs:scope-appcache -> This scope permits access to all files and list content of top level directories in the `$APPCACHE`folder.", + "type": "string", + "enum": [ + "fs:scope-appcache" + ] + }, + { + "description": "fs:scope-appcache-index -> This scope permits to list all files and folders in the `$APPCACHE`folder.", + "type": "string", + "enum": [ + "fs:scope-appcache-index" + ] + }, + { + "description": "fs:scope-appcache-recursive -> This scope permits recursive access to the complete `$APPCACHE` folder, including sub directories and files.", + "type": "string", + "enum": [ + "fs:scope-appcache-recursive" + ] + }, + { + "description": "fs:scope-appconfig -> This scope permits access to all files and list content of top level directories in the `$APPCONFIG`folder.", + "type": "string", + "enum": [ + "fs:scope-appconfig" + ] + }, + { + "description": "fs:scope-appconfig-index -> This scope permits to list all files and folders in the `$APPCONFIG`folder.", + "type": "string", + "enum": [ + "fs:scope-appconfig-index" + ] + }, + { + "description": "fs:scope-appconfig-recursive -> This scope permits recursive access to the complete `$APPCONFIG` folder, including sub directories and files.", + "type": "string", + "enum": [ + "fs:scope-appconfig-recursive" + ] + }, + { + "description": "fs:scope-appdata -> This scope permits access to all files and list content of top level directories in the `$APPDATA`folder.", + "type": "string", + "enum": [ + "fs:scope-appdata" + ] + }, + { + "description": "fs:scope-appdata-index -> This scope permits to list all files and folders in the `$APPDATA`folder.", + "type": "string", + "enum": [ + "fs:scope-appdata-index" + ] + }, + { + "description": "fs:scope-appdata-recursive -> This scope permits recursive access to the complete `$APPDATA` folder, including sub directories and files.", + "type": "string", + "enum": [ + "fs:scope-appdata-recursive" + ] + }, + { + "description": "fs:scope-applocaldata -> This scope permits access to all files and list content of top level directories in the `$APPLOCALDATA`folder.", + "type": "string", + "enum": [ + "fs:scope-applocaldata" + ] + }, + { + "description": "fs:scope-applocaldata-index -> This scope permits to list all files and folders in the `$APPLOCALDATA`folder.", + "type": "string", + "enum": [ + "fs:scope-applocaldata-index" + ] + }, + { + "description": "fs:scope-applocaldata-recursive -> This scope permits recursive access to the complete `$APPLOCALDATA` folder, including sub directories and files.", + "type": "string", + "enum": [ + "fs:scope-applocaldata-recursive" + ] + }, + { + "description": "fs:scope-applog -> This scope permits access to all files and list content of top level directories in the `$APPLOG`folder.", + "type": "string", + "enum": [ + "fs:scope-applog" + ] + }, + { + "description": "fs:scope-applog-index -> This scope permits to list all files and folders in the `$APPLOG`folder.", + "type": "string", + "enum": [ + "fs:scope-applog-index" + ] + }, + { + "description": "fs:scope-applog-recursive -> This scope permits recursive access to the complete `$APPLOG` folder, including sub directories and files.", + "type": "string", + "enum": [ + "fs:scope-applog-recursive" + ] + }, + { + "description": "fs:scope-audio -> This scope permits access to all files and list content of top level directories in the `$AUDIO`folder.", + "type": "string", + "enum": [ + "fs:scope-audio" + ] + }, + { + "description": "fs:scope-audio-index -> This scope permits to list all files and folders in the `$AUDIO`folder.", + "type": "string", + "enum": [ + "fs:scope-audio-index" + ] + }, + { + "description": "fs:scope-audio-recursive -> This scope permits recursive access to the complete `$AUDIO` folder, including sub directories and files.", + "type": "string", + "enum": [ + "fs:scope-audio-recursive" + ] + }, + { + "description": "fs:scope-cache -> This scope permits access to all files and list content of top level directories in the `$CACHE`folder.", + "type": "string", + "enum": [ + "fs:scope-cache" + ] + }, + { + "description": "fs:scope-cache-index -> This scope permits to list all files and folders in the `$CACHE`folder.", + "type": "string", + "enum": [ + "fs:scope-cache-index" + ] + }, + { + "description": "fs:scope-cache-recursive -> This scope permits recursive access to the complete `$CACHE` folder, including sub directories and files.", + "type": "string", + "enum": [ + "fs:scope-cache-recursive" + ] + }, + { + "description": "fs:scope-config -> This scope permits access to all files and list content of top level directories in the `$CONFIG`folder.", + "type": "string", + "enum": [ + "fs:scope-config" + ] + }, + { + "description": "fs:scope-config-index -> This scope permits to list all files and folders in the `$CONFIG`folder.", + "type": "string", + "enum": [ + "fs:scope-config-index" + ] + }, + { + "description": "fs:scope-config-recursive -> This scope permits recursive access to the complete `$CONFIG` folder, including sub directories and files.", + "type": "string", + "enum": [ + "fs:scope-config-recursive" + ] + }, + { + "description": "fs:scope-data -> This scope permits access to all files and list content of top level directories in the `$DATA`folder.", + "type": "string", + "enum": [ + "fs:scope-data" + ] + }, + { + "description": "fs:scope-data-index -> This scope permits to list all files and folders in the `$DATA`folder.", + "type": "string", + "enum": [ + "fs:scope-data-index" + ] + }, + { + "description": "fs:scope-data-recursive -> This scope permits recursive access to the complete `$DATA` folder, including sub directories and files.", + "type": "string", + "enum": [ + "fs:scope-data-recursive" + ] + }, + { + "description": "fs:scope-desktop -> This scope permits access to all files and list content of top level directories in the `$DESKTOP`folder.", + "type": "string", + "enum": [ + "fs:scope-desktop" + ] + }, + { + "description": "fs:scope-desktop-index -> This scope permits to list all files and folders in the `$DESKTOP`folder.", + "type": "string", + "enum": [ + "fs:scope-desktop-index" + ] + }, + { + "description": "fs:scope-desktop-recursive -> This scope permits recursive access to the complete `$DESKTOP` folder, including sub directories and files.", + "type": "string", + "enum": [ + "fs:scope-desktop-recursive" + ] + }, + { + "description": "fs:scope-document -> This scope permits access to all files and list content of top level directories in the `$DOCUMENT`folder.", + "type": "string", + "enum": [ + "fs:scope-document" + ] + }, + { + "description": "fs:scope-document-index -> This scope permits to list all files and folders in the `$DOCUMENT`folder.", + "type": "string", + "enum": [ + "fs:scope-document-index" + ] + }, + { + "description": "fs:scope-document-recursive -> This scope permits recursive access to the complete `$DOCUMENT` folder, including sub directories and files.", + "type": "string", + "enum": [ + "fs:scope-document-recursive" + ] + }, + { + "description": "fs:scope-download -> This scope permits access to all files and list content of top level directories in the `$DOWNLOAD`folder.", + "type": "string", + "enum": [ + "fs:scope-download" + ] + }, + { + "description": "fs:scope-download-index -> This scope permits to list all files and folders in the `$DOWNLOAD`folder.", + "type": "string", + "enum": [ + "fs:scope-download-index" + ] + }, + { + "description": "fs:scope-download-recursive -> This scope permits recursive access to the complete `$DOWNLOAD` folder, including sub directories and files.", + "type": "string", + "enum": [ + "fs:scope-download-recursive" + ] + }, + { + "description": "fs:scope-exe -> This scope permits access to all files and list content of top level directories in the `$EXE`folder.", + "type": "string", + "enum": [ + "fs:scope-exe" + ] + }, + { + "description": "fs:scope-exe-index -> This scope permits to list all files and folders in the `$EXE`folder.", + "type": "string", + "enum": [ + "fs:scope-exe-index" + ] + }, + { + "description": "fs:scope-exe-recursive -> This scope permits recursive access to the complete `$EXE` folder, including sub directories and files.", + "type": "string", + "enum": [ + "fs:scope-exe-recursive" + ] + }, + { + "description": "fs:scope-font -> This scope permits access to all files and list content of top level directories in the `$FONT`folder.", + "type": "string", + "enum": [ + "fs:scope-font" + ] + }, + { + "description": "fs:scope-font-index -> This scope permits to list all files and folders in the `$FONT`folder.", + "type": "string", + "enum": [ + "fs:scope-font-index" + ] + }, + { + "description": "fs:scope-font-recursive -> This scope permits recursive access to the complete `$FONT` folder, including sub directories and files.", + "type": "string", + "enum": [ + "fs:scope-font-recursive" + ] + }, + { + "description": "fs:scope-home -> This scope permits access to all files and list content of top level directories in the `$HOME`folder.", + "type": "string", + "enum": [ + "fs:scope-home" + ] + }, + { + "description": "fs:scope-home-index -> This scope permits to list all files and folders in the `$HOME`folder.", + "type": "string", + "enum": [ + "fs:scope-home-index" + ] + }, + { + "description": "fs:scope-home-recursive -> This scope permits recursive access to the complete `$HOME` folder, including sub directories and files.", + "type": "string", + "enum": [ + "fs:scope-home-recursive" + ] + }, + { + "description": "fs:scope-localdata -> This scope permits access to all files and list content of top level directories in the `$LOCALDATA`folder.", + "type": "string", + "enum": [ + "fs:scope-localdata" + ] + }, + { + "description": "fs:scope-localdata-index -> This scope permits to list all files and folders in the `$LOCALDATA`folder.", + "type": "string", + "enum": [ + "fs:scope-localdata-index" + ] + }, + { + "description": "fs:scope-localdata-recursive -> This scope permits recursive access to the complete `$LOCALDATA` folder, including sub directories and files.", + "type": "string", + "enum": [ + "fs:scope-localdata-recursive" + ] + }, + { + "description": "fs:scope-log -> This scope permits access to all files and list content of top level directories in the `$LOG`folder.", + "type": "string", + "enum": [ + "fs:scope-log" + ] + }, + { + "description": "fs:scope-log-index -> This scope permits to list all files and folders in the `$LOG`folder.", + "type": "string", + "enum": [ + "fs:scope-log-index" + ] + }, + { + "description": "fs:scope-log-recursive -> This scope permits recursive access to the complete `$LOG` folder, including sub directories and files.", + "type": "string", + "enum": [ + "fs:scope-log-recursive" + ] + }, + { + "description": "fs:scope-picture -> This scope permits access to all files and list content of top level directories in the `$PICTURE`folder.", + "type": "string", + "enum": [ + "fs:scope-picture" + ] + }, + { + "description": "fs:scope-picture-index -> This scope permits to list all files and folders in the `$PICTURE`folder.", + "type": "string", + "enum": [ + "fs:scope-picture-index" + ] + }, + { + "description": "fs:scope-picture-recursive -> This scope permits recursive access to the complete `$PICTURE` folder, including sub directories and files.", + "type": "string", + "enum": [ + "fs:scope-picture-recursive" + ] + }, + { + "description": "fs:scope-public -> This scope permits access to all files and list content of top level directories in the `$PUBLIC`folder.", + "type": "string", + "enum": [ + "fs:scope-public" + ] + }, + { + "description": "fs:scope-public-index -> This scope permits to list all files and folders in the `$PUBLIC`folder.", + "type": "string", + "enum": [ + "fs:scope-public-index" + ] + }, + { + "description": "fs:scope-public-recursive -> This scope permits recursive access to the complete `$PUBLIC` folder, including sub directories and files.", + "type": "string", + "enum": [ + "fs:scope-public-recursive" + ] + }, + { + "description": "fs:scope-resource -> This scope permits access to all files and list content of top level directories in the `$RESOURCE`folder.", + "type": "string", + "enum": [ + "fs:scope-resource" + ] + }, + { + "description": "fs:scope-resource-index -> This scope permits to list all files and folders in the `$RESOURCE`folder.", + "type": "string", + "enum": [ + "fs:scope-resource-index" + ] + }, + { + "description": "fs:scope-resource-recursive -> This scope permits recursive access to the complete `$RESOURCE` folder, including sub directories and files.", + "type": "string", + "enum": [ + "fs:scope-resource-recursive" + ] + }, + { + "description": "fs:scope-runtime -> This scope permits access to all files and list content of top level directories in the `$RUNTIME`folder.", + "type": "string", + "enum": [ + "fs:scope-runtime" + ] + }, + { + "description": "fs:scope-runtime-index -> This scope permits to list all files and folders in the `$RUNTIME`folder.", + "type": "string", + "enum": [ + "fs:scope-runtime-index" + ] + }, + { + "description": "fs:scope-runtime-recursive -> This scope permits recursive access to the complete `$RUNTIME` folder, including sub directories and files.", + "type": "string", + "enum": [ + "fs:scope-runtime-recursive" + ] + }, + { + "description": "fs:scope-temp -> This scope permits access to all files and list content of top level directories in the `$TEMP`folder.", + "type": "string", + "enum": [ + "fs:scope-temp" + ] + }, + { + "description": "fs:scope-temp-index -> This scope permits to list all files and folders in the `$TEMP`folder.", + "type": "string", + "enum": [ + "fs:scope-temp-index" + ] + }, + { + "description": "fs:scope-temp-recursive -> This scope permits recursive access to the complete `$TEMP` folder, including sub directories and files.", + "type": "string", + "enum": [ + "fs:scope-temp-recursive" + ] + }, + { + "description": "fs:scope-template -> This scope permits access to all files and list content of top level directories in the `$TEMPLATE`folder.", + "type": "string", + "enum": [ + "fs:scope-template" + ] + }, + { + "description": "fs:scope-template-index -> This scope permits to list all files and folders in the `$TEMPLATE`folder.", + "type": "string", + "enum": [ + "fs:scope-template-index" + ] + }, + { + "description": "fs:scope-template-recursive -> This scope permits recursive access to the complete `$TEMPLATE` folder, including sub directories and files.", + "type": "string", + "enum": [ + "fs:scope-template-recursive" + ] + }, + { + "description": "fs:scope-video -> This scope permits access to all files and list content of top level directories in the `$VIDEO`folder.", + "type": "string", + "enum": [ + "fs:scope-video" + ] + }, + { + "description": "fs:scope-video-index -> This scope permits to list all files and folders in the `$VIDEO`folder.", + "type": "string", + "enum": [ + "fs:scope-video-index" + ] + }, + { + "description": "fs:scope-video-recursive -> This scope permits recursive access to the complete `$VIDEO` folder, including sub directories and files.", + "type": "string", + "enum": [ + "fs:scope-video-recursive" + ] + }, + { + "description": "fs:write-all -> This enables all write related commands without any pre-configured accessible paths.", + "type": "string", + "enum": [ + "fs:write-all" + ] + }, + { + "description": "fs:write-files -> This enables all file write related commands without any pre-configured accessible paths.", + "type": "string", + "enum": [ + "fs:write-files" + ] + }, + { + "description": "global-shortcut:default -> No features are enabled by default, as we believe\nthe shortcuts can be inherently dangerous and it is\napplication specific if specific shortcuts should be\nregistered or unregistered.\n", + "type": "string", + "enum": [ + "global-shortcut:default" + ] + }, + { + "description": "global-shortcut:allow-is-registered -> Enables the is_registered command without any pre-configured scope.", + "type": "string", + "enum": [ + "global-shortcut:allow-is-registered" + ] + }, + { + "description": "global-shortcut:allow-register -> Enables the register command without any pre-configured scope.", + "type": "string", + "enum": [ + "global-shortcut:allow-register" + ] + }, + { + "description": "global-shortcut:allow-register-all -> Enables the register_all command without any pre-configured scope.", + "type": "string", + "enum": [ + "global-shortcut:allow-register-all" + ] + }, + { + "description": "global-shortcut:allow-unregister -> Enables the unregister command without any pre-configured scope.", + "type": "string", + "enum": [ + "global-shortcut:allow-unregister" + ] + }, + { + "description": "global-shortcut:allow-unregister-all -> Enables the unregister_all command without any pre-configured scope.", + "type": "string", + "enum": [ + "global-shortcut:allow-unregister-all" + ] + }, + { + "description": "global-shortcut:deny-is-registered -> Denies the is_registered command without any pre-configured scope.", + "type": "string", + "enum": [ + "global-shortcut:deny-is-registered" + ] + }, + { + "description": "global-shortcut:deny-register -> Denies the register command without any pre-configured scope.", + "type": "string", + "enum": [ + "global-shortcut:deny-register" + ] + }, + { + "description": "global-shortcut:deny-register-all -> Denies the register_all command without any pre-configured scope.", + "type": "string", + "enum": [ + "global-shortcut:deny-register-all" + ] + }, + { + "description": "global-shortcut:deny-unregister -> Denies the unregister command without any pre-configured scope.", + "type": "string", + "enum": [ + "global-shortcut:deny-unregister" + ] + }, + { + "description": "global-shortcut:deny-unregister-all -> Denies the unregister_all command without any pre-configured scope.", + "type": "string", + "enum": [ + "global-shortcut:deny-unregister-all" + ] + }, + { + "description": "notification:default -> This permission set configures which\nnotification features are by default exposed.\n\n#### Granted Permissions\n\nIt allows all notification related features.\n\n", + "type": "string", + "enum": [ + "notification:default" + ] + }, + { + "description": "notification:allow-batch -> Enables the batch command without any pre-configured scope.", + "type": "string", + "enum": [ + "notification:allow-batch" + ] + }, + { + "description": "notification:allow-cancel -> Enables the cancel command without any pre-configured scope.", + "type": "string", + "enum": [ + "notification:allow-cancel" + ] + }, + { + "description": "notification:allow-check-permissions -> Enables the check_permissions command without any pre-configured scope.", + "type": "string", + "enum": [ + "notification:allow-check-permissions" + ] + }, + { + "description": "notification:allow-create-channel -> Enables the create_channel command without any pre-configured scope.", + "type": "string", + "enum": [ + "notification:allow-create-channel" + ] + }, + { + "description": "notification:allow-delete-channel -> Enables the delete_channel command without any pre-configured scope.", + "type": "string", + "enum": [ + "notification:allow-delete-channel" + ] + }, + { + "description": "notification:allow-get-active -> Enables the get_active command without any pre-configured scope.", + "type": "string", + "enum": [ + "notification:allow-get-active" + ] + }, + { + "description": "notification:allow-get-pending -> Enables the get_pending command without any pre-configured scope.", + "type": "string", + "enum": [ + "notification:allow-get-pending" + ] + }, + { + "description": "notification:allow-is-permission-granted -> Enables the is_permission_granted command without any pre-configured scope.", + "type": "string", + "enum": [ + "notification:allow-is-permission-granted" + ] + }, + { + "description": "notification:allow-list-channels -> Enables the list_channels command without any pre-configured scope.", + "type": "string", + "enum": [ + "notification:allow-list-channels" + ] + }, + { + "description": "notification:allow-notify -> Enables the notify command without any pre-configured scope.", + "type": "string", + "enum": [ + "notification:allow-notify" + ] + }, + { + "description": "notification:allow-permission-state -> Enables the permission_state command without any pre-configured scope.", + "type": "string", + "enum": [ + "notification:allow-permission-state" + ] + }, + { + "description": "notification:allow-register-action-types -> Enables the register_action_types command without any pre-configured scope.", + "type": "string", + "enum": [ + "notification:allow-register-action-types" + ] + }, + { + "description": "notification:allow-register-listener -> Enables the register_listener command without any pre-configured scope.", + "type": "string", + "enum": [ + "notification:allow-register-listener" + ] + }, + { + "description": "notification:allow-remove-active -> Enables the remove_active command without any pre-configured scope.", + "type": "string", + "enum": [ + "notification:allow-remove-active" + ] + }, + { + "description": "notification:allow-request-permission -> Enables the request_permission command without any pre-configured scope.", + "type": "string", + "enum": [ + "notification:allow-request-permission" + ] + }, + { + "description": "notification:allow-show -> Enables the show command without any pre-configured scope.", + "type": "string", + "enum": [ + "notification:allow-show" + ] + }, + { + "description": "notification:deny-batch -> Denies the batch command without any pre-configured scope.", + "type": "string", + "enum": [ + "notification:deny-batch" + ] + }, + { + "description": "notification:deny-cancel -> Denies the cancel command without any pre-configured scope.", + "type": "string", + "enum": [ + "notification:deny-cancel" + ] + }, + { + "description": "notification:deny-check-permissions -> Denies the check_permissions command without any pre-configured scope.", + "type": "string", + "enum": [ + "notification:deny-check-permissions" + ] + }, + { + "description": "notification:deny-create-channel -> Denies the create_channel command without any pre-configured scope.", + "type": "string", + "enum": [ + "notification:deny-create-channel" + ] + }, + { + "description": "notification:deny-delete-channel -> Denies the delete_channel command without any pre-configured scope.", + "type": "string", + "enum": [ + "notification:deny-delete-channel" + ] + }, + { + "description": "notification:deny-get-active -> Denies the get_active command without any pre-configured scope.", + "type": "string", + "enum": [ + "notification:deny-get-active" + ] + }, + { + "description": "notification:deny-get-pending -> Denies the get_pending command without any pre-configured scope.", + "type": "string", + "enum": [ + "notification:deny-get-pending" + ] + }, + { + "description": "notification:deny-is-permission-granted -> Denies the is_permission_granted command without any pre-configured scope.", + "type": "string", + "enum": [ + "notification:deny-is-permission-granted" + ] + }, + { + "description": "notification:deny-list-channels -> Denies the list_channels command without any pre-configured scope.", + "type": "string", + "enum": [ + "notification:deny-list-channels" + ] + }, + { + "description": "notification:deny-notify -> Denies the notify command without any pre-configured scope.", + "type": "string", + "enum": [ + "notification:deny-notify" + ] + }, + { + "description": "notification:deny-permission-state -> Denies the permission_state command without any pre-configured scope.", + "type": "string", + "enum": [ + "notification:deny-permission-state" + ] + }, + { + "description": "notification:deny-register-action-types -> Denies the register_action_types command without any pre-configured scope.", + "type": "string", + "enum": [ + "notification:deny-register-action-types" + ] + }, + { + "description": "notification:deny-register-listener -> Denies the register_listener command without any pre-configured scope.", + "type": "string", + "enum": [ + "notification:deny-register-listener" + ] + }, + { + "description": "notification:deny-remove-active -> Denies the remove_active command without any pre-configured scope.", + "type": "string", + "enum": [ + "notification:deny-remove-active" + ] + }, + { + "description": "notification:deny-request-permission -> Denies the request_permission command without any pre-configured scope.", + "type": "string", + "enum": [ + "notification:deny-request-permission" + ] + }, + { + "description": "notification:deny-show -> Denies the show command without any pre-configured scope.", + "type": "string", + "enum": [ + "notification:deny-show" + ] + }, + { + "description": "os:default -> This permission set configures which\noperating system information are available\nto gather from the frontend.\n\n#### Granted Permissions\n\nAll information except the host name are available.\n\n", + "type": "string", + "enum": [ + "os:default" + ] + }, + { + "description": "os:allow-arch -> Enables the arch command without any pre-configured scope.", + "type": "string", + "enum": [ + "os:allow-arch" + ] + }, + { + "description": "os:allow-exe-extension -> Enables the exe_extension command without any pre-configured scope.", + "type": "string", + "enum": [ + "os:allow-exe-extension" + ] + }, + { + "description": "os:allow-family -> Enables the family command without any pre-configured scope.", + "type": "string", + "enum": [ + "os:allow-family" + ] + }, + { + "description": "os:allow-hostname -> Enables the hostname command without any pre-configured scope.", + "type": "string", + "enum": [ + "os:allow-hostname" + ] + }, + { + "description": "os:allow-locale -> Enables the locale command without any pre-configured scope.", + "type": "string", + "enum": [ + "os:allow-locale" + ] + }, + { + "description": "os:allow-os-type -> Enables the os_type command without any pre-configured scope.", + "type": "string", + "enum": [ + "os:allow-os-type" + ] + }, + { + "description": "os:allow-platform -> Enables the platform command without any pre-configured scope.", + "type": "string", + "enum": [ + "os:allow-platform" + ] + }, + { + "description": "os:allow-version -> Enables the version command without any pre-configured scope.", + "type": "string", + "enum": [ + "os:allow-version" + ] + }, + { + "description": "os:deny-arch -> Denies the arch command without any pre-configured scope.", + "type": "string", + "enum": [ + "os:deny-arch" + ] + }, + { + "description": "os:deny-exe-extension -> Denies the exe_extension command without any pre-configured scope.", + "type": "string", + "enum": [ + "os:deny-exe-extension" + ] + }, + { + "description": "os:deny-family -> Denies the family command without any pre-configured scope.", + "type": "string", + "enum": [ + "os:deny-family" + ] + }, + { + "description": "os:deny-hostname -> Denies the hostname command without any pre-configured scope.", + "type": "string", + "enum": [ + "os:deny-hostname" + ] + }, + { + "description": "os:deny-locale -> Denies the locale command without any pre-configured scope.", + "type": "string", + "enum": [ + "os:deny-locale" + ] + }, + { + "description": "os:deny-os-type -> Denies the os_type command without any pre-configured scope.", + "type": "string", + "enum": [ + "os:deny-os-type" + ] + }, + { + "description": "os:deny-platform -> Denies the platform command without any pre-configured scope.", + "type": "string", + "enum": [ + "os:deny-platform" + ] + }, + { + "description": "os:deny-version -> Denies the version command without any pre-configured scope.", + "type": "string", + "enum": [ + "os:deny-version" + ] + }, + { + "description": "process:default -> This permission set configures which\nprocess feeatures are by default exposed.\n\n#### Granted Permissions\n\nThis enables to quit via `allow-exit` and restart via `allow-restart`\nthe application.\n", + "type": "string", + "enum": [ + "process:default" + ] + }, + { + "description": "process:allow-exit -> Enables the exit command without any pre-configured scope.", + "type": "string", + "enum": [ + "process:allow-exit" + ] + }, + { + "description": "process:allow-restart -> Enables the restart command without any pre-configured scope.", + "type": "string", + "enum": [ + "process:allow-restart" + ] + }, + { + "description": "process:deny-exit -> Denies the exit command without any pre-configured scope.", + "type": "string", + "enum": [ + "process:deny-exit" + ] + }, + { + "description": "process:deny-restart -> Denies the restart command without any pre-configured scope.", + "type": "string", + "enum": [ + "process:deny-restart" + ] + }, + { + "description": "shell:default -> This permission set configures which\nshell functionality is exposed by default.\n\n#### Granted Permissions\n\nIt allows to use the `open` functionality without any specific\nscope pre-configured. It will allow opening `http(s)://`,\n`tel:` and `mailto:` links.\n", + "type": "string", + "enum": [ + "shell:default" + ] + }, + { + "description": "shell:allow-execute -> Enables the execute command without any pre-configured scope.", + "type": "string", + "enum": [ + "shell:allow-execute" + ] + }, + { + "description": "shell:allow-kill -> Enables the kill command without any pre-configured scope.", + "type": "string", + "enum": [ + "shell:allow-kill" + ] + }, + { + "description": "shell:allow-open -> Enables the open command without any pre-configured scope.", + "type": "string", + "enum": [ + "shell:allow-open" + ] + }, + { + "description": "shell:allow-spawn -> Enables the spawn command without any pre-configured scope.", + "type": "string", + "enum": [ + "shell:allow-spawn" + ] + }, + { + "description": "shell:allow-stdin-write -> Enables the stdin_write command without any pre-configured scope.", + "type": "string", + "enum": [ + "shell:allow-stdin-write" + ] + }, + { + "description": "shell:deny-execute -> Denies the execute command without any pre-configured scope.", + "type": "string", + "enum": [ + "shell:deny-execute" + ] + }, + { + "description": "shell:deny-kill -> Denies the kill command without any pre-configured scope.", + "type": "string", + "enum": [ + "shell:deny-kill" + ] + }, + { + "description": "shell:deny-open -> Denies the open command without any pre-configured scope.", + "type": "string", + "enum": [ + "shell:deny-open" + ] + }, + { + "description": "shell:deny-spawn -> Denies the spawn command without any pre-configured scope.", + "type": "string", + "enum": [ + "shell:deny-spawn" + ] + }, + { + "description": "shell:deny-stdin-write -> Denies the stdin_write command without any pre-configured scope.", + "type": "string", + "enum": [ + "shell:deny-stdin-write" + ] + }, + { + "description": "updater:default -> This permission set configures which kind of\nupdater functions are exposed to the frontend.\n\n#### Granted Permissions\n\nThe full workflow from checking for updates to installing them\nis enabled.\n\n", + "type": "string", + "enum": [ + "updater:default" + ] + }, + { + "description": "updater:allow-check -> Enables the check command without any pre-configured scope.", + "type": "string", + "enum": [ + "updater:allow-check" + ] + }, + { + "description": "updater:allow-download -> Enables the download command without any pre-configured scope.", + "type": "string", + "enum": [ + "updater:allow-download" + ] + }, + { + "description": "updater:allow-download-and-install -> Enables the download_and_install command without any pre-configured scope.", + "type": "string", + "enum": [ + "updater:allow-download-and-install" + ] + }, + { + "description": "updater:allow-install -> Enables the install command without any pre-configured scope.", + "type": "string", + "enum": [ + "updater:allow-install" + ] + }, + { + "description": "updater:deny-check -> Denies the check command without any pre-configured scope.", + "type": "string", + "enum": [ + "updater:deny-check" + ] + }, + { + "description": "updater:deny-download -> Denies the download command without any pre-configured scope.", + "type": "string", + "enum": [ + "updater:deny-download" + ] + }, + { + "description": "updater:deny-download-and-install -> Denies the download_and_install command without any pre-configured scope.", + "type": "string", + "enum": [ + "updater:deny-download-and-install" + ] + }, + { + "description": "updater:deny-install -> Denies the install command without any pre-configured scope.", + "type": "string", + "enum": [ + "updater:deny-install" + ] + } + ] + }, + "Value": { + "description": "All supported ACL values.", + "anyOf": [ + { + "description": "Represents a null JSON value.", + "type": "null" + }, + { + "description": "Represents a [`bool`].", + "type": "boolean" + }, + { + "description": "Represents a valid ACL [`Number`].", + "allOf": [ + { + "$ref": "#/definitions/Number" + } + ] + }, + { + "description": "Represents a [`String`].", + "type": "string" + }, + { + "description": "Represents a list of other [`Value`]s.", + "type": "array", + "items": { + "$ref": "#/definitions/Value" + } + }, + { + "description": "Represents a map of [`String`] keys to [`Value`]s.", + "type": "object", + "additionalProperties": { + "$ref": "#/definitions/Value" + } + } + ] + }, + "Number": { + "description": "A valid ACL number.", + "anyOf": [ + { + "description": "Represents an [`i64`].", + "type": "integer", + "format": "int64" + }, + { + "description": "Represents a [`f64`].", + "type": "number", + "format": "double" + } + ] + }, + "Target": { + "description": "Platform target.", + "oneOf": [ + { + "description": "MacOS.", + "type": "string", + "enum": [ + "macOS" + ] + }, + { + "description": "Windows.", + "type": "string", + "enum": [ + "windows" + ] + }, + { + "description": "Linux.", + "type": "string", + "enum": [ + "linux" + ] + }, + { + "description": "Android.", + "type": "string", + "enum": [ + "android" + ] + }, + { + "description": "iOS.", + "type": "string", + "enum": [ + "iOS" + ] + } + ] + }, + "ShellAllowedArg": { + "description": "A command argument allowed to be executed by the webview API.", + "anyOf": [ + { + "description": "A non-configurable argument that is passed to the command in the order it was specified.", + "type": "string" + }, + { + "description": "A variable that is set while calling the command from the webview API.", + "type": "object", + "required": [ + "validator" + ], + "properties": { + "raw": { + "description": "Marks the validator as a raw regex, meaning the plugin should not make any modification at runtime.\n\nThis means the regex will not match on the entire string by default, which might be exploited if your regex allow unexpected input to be considered valid. When using this option, make sure your regex is correct.", + "default": false, + "type": "boolean" + }, + "validator": { + "description": "[regex] validator to require passed values to conform to an expected input.\n\nThis will require the argument value passed to this variable to match the `validator` regex before it will be executed.\n\nThe regex string is by default surrounded by `^...$` to match the full string. For example the `https?://\\w+` regex would be registered as `^https?://\\w+$`.\n\n[regex]: ", + "type": "string" + } + }, + "additionalProperties": false + } + ] + }, + "ShellAllowedArgs": { + "description": "A set of command arguments allowed to be executed by the webview API.\n\nA value of `true` will allow any arguments to be passed to the command. `false` will disable all arguments. A list of [`ShellAllowedArg`] will set those arguments as the only valid arguments to be passed to the attached command configuration.", + "anyOf": [ + { + "description": "Use a simple boolean to allow all or disable all arguments to this command configuration.", + "type": "boolean" + }, + { + "description": "A specific set of [`ShellAllowedArg`] that are valid to call for the command configuration.", + "type": "array", + "items": { + "$ref": "#/definitions/ShellAllowedArg" + } + } + ] + } + } +} \ No newline at end of file diff --git a/clash-nyanpasu/backend/tauri/gen/schemas/linux-schema.json b/clash-nyanpasu/backend/tauri/gen/schemas/linux-schema.json new file mode 100644 index 0000000000..3fe03ed0f2 --- /dev/null +++ b/clash-nyanpasu/backend/tauri/gen/schemas/linux-schema.json @@ -0,0 +1,7244 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "CapabilityFile", + "description": "Capability formats accepted in a capability file.", + "anyOf": [ + { + "description": "A single capability.", + "allOf": [ + { + "$ref": "#/definitions/Capability" + } + ] + }, + { + "description": "A list of capabilities.", + "type": "array", + "items": { + "$ref": "#/definitions/Capability" + } + }, + { + "description": "A list of capabilities.", + "type": "object", + "required": [ + "capabilities" + ], + "properties": { + "capabilities": { + "description": "The list of capabilities.", + "type": "array", + "items": { + "$ref": "#/definitions/Capability" + } + } + } + } + ], + "definitions": { + "Capability": { + "description": "A grouping and boundary mechanism developers can use to isolate access to the IPC layer.\n\nIt controls application windows fine grained access to the Tauri core, application, or plugin commands. If a window is not matching any capability then it has no access to the IPC layer at all.\n\nThis can be done to create groups of windows, based on their required system access, which can reduce impact of frontend vulnerabilities in less privileged windows. Windows can be added to a capability by exact name (e.g. `main-window`) or glob patterns like `*` or `admin-*`. A Window can have none, one, or multiple associated capabilities.\n\n## Example\n\n```json { \"identifier\": \"main-user-files-write\", \"description\": \"This capability allows the `main` window on macOS and Windows access to `filesystem` write related commands and `dialog` commands to enable programatic access to files selected by the user.\", \"windows\": [ \"main\" ], \"permissions\": [ \"core:default\", \"dialog:open\", { \"identifier\": \"fs:allow-write-text-file\", \"allow\": [{ \"path\": \"$HOME/test.txt\" }] }, \"platforms\": [\"macOS\",\"windows\"] } ```", + "type": "object", + "required": [ + "identifier", + "permissions" + ], + "properties": { + "identifier": { + "description": "Identifier of the capability.\n\n## Example\n\n`main-user-files-write`", + "type": "string" + }, + "description": { + "description": "Description of what the capability is intended to allow on associated windows.\n\nIt should contain a description of what the grouped permissions should allow.\n\n## Example\n\nThis capability allows the `main` window access to `filesystem` write related commands and `dialog` commands to enable programatic access to files selected by the user.", + "default": "", + "type": "string" + }, + "remote": { + "description": "Configure remote URLs that can use the capability permissions.\n\nThis setting is optional and defaults to not being set, as our default use case is that the content is served from our local application.\n\n:::caution Make sure you understand the security implications of providing remote sources with local system access. :::\n\n## Example\n\n```json { \"urls\": [\"https://*.mydomain.dev\"] } ```", + "anyOf": [ + { + "$ref": "#/definitions/CapabilityRemote" + }, + { + "type": "null" + } + ] + }, + "local": { + "description": "Whether this capability is enabled for local app URLs or not. Defaults to `true`.", + "default": true, + "type": "boolean" + }, + "windows": { + "description": "List of windows that are affected by this capability. Can be a glob pattern.\n\nOn multiwebview windows, prefer [`Self::webviews`] for a fine grained access control.\n\n## Example\n\n`[\"main\"]`", + "type": "array", + "items": { + "type": "string" + } + }, + "webviews": { + "description": "List of webviews that are affected by this capability. Can be a glob pattern.\n\nThis is only required when using on multiwebview contexts, by default all child webviews of a window that matches [`Self::windows`] are linked.\n\n## Example\n\n`[\"sub-webview-one\", \"sub-webview-two\"]`", + "type": "array", + "items": { + "type": "string" + } + }, + "permissions": { + "description": "List of permissions attached to this capability.\n\nMust include the plugin name as prefix in the form of `${plugin-name}:${permission-name}`. For commands directly implemented in the application itself only `${permission-name}` is required.\n\n## Example\n\n```json [ \"core:default\", \"shell:allow-open\", \"dialog:open\", { \"identifier\": \"fs:allow-write-text-file\", \"allow\": [{ \"path\": \"$HOME/test.txt\" }] } ```", + "type": "array", + "items": { + "$ref": "#/definitions/PermissionEntry" + }, + "uniqueItems": true + }, + "platforms": { + "description": "Limit which target platforms this capability applies to.\n\nBy default all platforms are targeted.\n\n## Example\n\n`[\"macOS\",\"windows\"]`", + "type": [ + "array", + "null" + ], + "items": { + "$ref": "#/definitions/Target" + } + } + } + }, + "CapabilityRemote": { + "description": "Configuration for remote URLs that are associated with the capability.", + "type": "object", + "required": [ + "urls" + ], + "properties": { + "urls": { + "description": "Remote domains this capability refers to using the [URLPattern standard](https://urlpattern.spec.whatwg.org/).\n\n## Examples\n\n- \"https://*.mydomain.dev\": allows subdomains of mydomain.dev - \"https://mydomain.dev/api/*\": allows any subpath of mydomain.dev/api", + "type": "array", + "items": { + "type": "string" + } + } + } + }, + "PermissionEntry": { + "description": "An entry for a permission value in a [`Capability`] can be either a raw permission [`Identifier`] or an object that references a permission and extends its scope.", + "anyOf": [ + { + "description": "Reference a permission or permission set by identifier.", + "allOf": [ + { + "$ref": "#/definitions/Identifier" + } + ] + }, + { + "description": "Reference a permission or permission set by identifier and extends its scope.", + "type": "object", + "oneOf": [ + { + "type": "object", + "required": [ + "identifier" + ], + "properties": { + "identifier": { + "oneOf": [ + { + "description": "fs:default -> This set of permissions describes the what kind of\nfile system access the `fs` plugin has enabled or denied by default.\n\n#### Granted Permissions\n\nThis default permission set enables read access to the\napplication specific directories (AppConfig, AppData, AppLocalData, AppCache,\nAppLog) and all files and sub directories created in it.\nThe location of these directories depends on the operating system,\nwhere the application is run.\n\nIn general these directories need to be manually created\nby the application at runtime, before accessing files or folders\nin it is possible.\n\nTherefore, it is also allowed to create all of these folders via\nthe `mkdir` command.\n\n#### Denied Permissions\n\nThis default permission set prevents access to critical components\nof the Tauri application by default.\nOn Windows the webview data folder access is denied.\n\n", + "type": "string", + "enum": [ + "fs:default" + ] + }, + { + "description": "fs:allow-app-meta -> This allows non-recursive read access to metadata of the `$APP` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-app-meta" + ] + }, + { + "description": "fs:allow-app-meta-recursive -> This allows full recursive read access to metadata of the `$APP` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-app-meta-recursive" + ] + }, + { + "description": "fs:allow-app-read -> This allows non-recursive read access to the `$APP` folder.", + "type": "string", + "enum": [ + "fs:allow-app-read" + ] + }, + { + "description": "fs:allow-app-read-recursive -> This allows full recursive read access to the complete `$APP` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-app-read-recursive" + ] + }, + { + "description": "fs:allow-app-write -> This allows non-recursive write access to the `$APP` folder.", + "type": "string", + "enum": [ + "fs:allow-app-write" + ] + }, + { + "description": "fs:allow-app-write-recursive -> This allows full recursive write access to the complete `$APP` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-app-write-recursive" + ] + }, + { + "description": "fs:allow-appcache-meta -> This allows non-recursive read access to metadata of the `$APPCACHE` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-appcache-meta" + ] + }, + { + "description": "fs:allow-appcache-meta-recursive -> This allows full recursive read access to metadata of the `$APPCACHE` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-appcache-meta-recursive" + ] + }, + { + "description": "fs:allow-appcache-read -> This allows non-recursive read access to the `$APPCACHE` folder.", + "type": "string", + "enum": [ + "fs:allow-appcache-read" + ] + }, + { + "description": "fs:allow-appcache-read-recursive -> This allows full recursive read access to the complete `$APPCACHE` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-appcache-read-recursive" + ] + }, + { + "description": "fs:allow-appcache-write -> This allows non-recursive write access to the `$APPCACHE` folder.", + "type": "string", + "enum": [ + "fs:allow-appcache-write" + ] + }, + { + "description": "fs:allow-appcache-write-recursive -> This allows full recursive write access to the complete `$APPCACHE` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-appcache-write-recursive" + ] + }, + { + "description": "fs:allow-appconfig-meta -> This allows non-recursive read access to metadata of the `$APPCONFIG` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-appconfig-meta" + ] + }, + { + "description": "fs:allow-appconfig-meta-recursive -> This allows full recursive read access to metadata of the `$APPCONFIG` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-appconfig-meta-recursive" + ] + }, + { + "description": "fs:allow-appconfig-read -> This allows non-recursive read access to the `$APPCONFIG` folder.", + "type": "string", + "enum": [ + "fs:allow-appconfig-read" + ] + }, + { + "description": "fs:allow-appconfig-read-recursive -> This allows full recursive read access to the complete `$APPCONFIG` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-appconfig-read-recursive" + ] + }, + { + "description": "fs:allow-appconfig-write -> This allows non-recursive write access to the `$APPCONFIG` folder.", + "type": "string", + "enum": [ + "fs:allow-appconfig-write" + ] + }, + { + "description": "fs:allow-appconfig-write-recursive -> This allows full recursive write access to the complete `$APPCONFIG` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-appconfig-write-recursive" + ] + }, + { + "description": "fs:allow-appdata-meta -> This allows non-recursive read access to metadata of the `$APPDATA` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-appdata-meta" + ] + }, + { + "description": "fs:allow-appdata-meta-recursive -> This allows full recursive read access to metadata of the `$APPDATA` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-appdata-meta-recursive" + ] + }, + { + "description": "fs:allow-appdata-read -> This allows non-recursive read access to the `$APPDATA` folder.", + "type": "string", + "enum": [ + "fs:allow-appdata-read" + ] + }, + { + "description": "fs:allow-appdata-read-recursive -> This allows full recursive read access to the complete `$APPDATA` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-appdata-read-recursive" + ] + }, + { + "description": "fs:allow-appdata-write -> This allows non-recursive write access to the `$APPDATA` folder.", + "type": "string", + "enum": [ + "fs:allow-appdata-write" + ] + }, + { + "description": "fs:allow-appdata-write-recursive -> This allows full recursive write access to the complete `$APPDATA` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-appdata-write-recursive" + ] + }, + { + "description": "fs:allow-applocaldata-meta -> This allows non-recursive read access to metadata of the `$APPLOCALDATA` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-applocaldata-meta" + ] + }, + { + "description": "fs:allow-applocaldata-meta-recursive -> This allows full recursive read access to metadata of the `$APPLOCALDATA` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-applocaldata-meta-recursive" + ] + }, + { + "description": "fs:allow-applocaldata-read -> This allows non-recursive read access to the `$APPLOCALDATA` folder.", + "type": "string", + "enum": [ + "fs:allow-applocaldata-read" + ] + }, + { + "description": "fs:allow-applocaldata-read-recursive -> This allows full recursive read access to the complete `$APPLOCALDATA` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-applocaldata-read-recursive" + ] + }, + { + "description": "fs:allow-applocaldata-write -> This allows non-recursive write access to the `$APPLOCALDATA` folder.", + "type": "string", + "enum": [ + "fs:allow-applocaldata-write" + ] + }, + { + "description": "fs:allow-applocaldata-write-recursive -> This allows full recursive write access to the complete `$APPLOCALDATA` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-applocaldata-write-recursive" + ] + }, + { + "description": "fs:allow-applog-meta -> This allows non-recursive read access to metadata of the `$APPLOG` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-applog-meta" + ] + }, + { + "description": "fs:allow-applog-meta-recursive -> This allows full recursive read access to metadata of the `$APPLOG` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-applog-meta-recursive" + ] + }, + { + "description": "fs:allow-applog-read -> This allows non-recursive read access to the `$APPLOG` folder.", + "type": "string", + "enum": [ + "fs:allow-applog-read" + ] + }, + { + "description": "fs:allow-applog-read-recursive -> This allows full recursive read access to the complete `$APPLOG` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-applog-read-recursive" + ] + }, + { + "description": "fs:allow-applog-write -> This allows non-recursive write access to the `$APPLOG` folder.", + "type": "string", + "enum": [ + "fs:allow-applog-write" + ] + }, + { + "description": "fs:allow-applog-write-recursive -> This allows full recursive write access to the complete `$APPLOG` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-applog-write-recursive" + ] + }, + { + "description": "fs:allow-audio-meta -> This allows non-recursive read access to metadata of the `$AUDIO` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-audio-meta" + ] + }, + { + "description": "fs:allow-audio-meta-recursive -> This allows full recursive read access to metadata of the `$AUDIO` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-audio-meta-recursive" + ] + }, + { + "description": "fs:allow-audio-read -> This allows non-recursive read access to the `$AUDIO` folder.", + "type": "string", + "enum": [ + "fs:allow-audio-read" + ] + }, + { + "description": "fs:allow-audio-read-recursive -> This allows full recursive read access to the complete `$AUDIO` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-audio-read-recursive" + ] + }, + { + "description": "fs:allow-audio-write -> This allows non-recursive write access to the `$AUDIO` folder.", + "type": "string", + "enum": [ + "fs:allow-audio-write" + ] + }, + { + "description": "fs:allow-audio-write-recursive -> This allows full recursive write access to the complete `$AUDIO` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-audio-write-recursive" + ] + }, + { + "description": "fs:allow-cache-meta -> This allows non-recursive read access to metadata of the `$CACHE` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-cache-meta" + ] + }, + { + "description": "fs:allow-cache-meta-recursive -> This allows full recursive read access to metadata of the `$CACHE` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-cache-meta-recursive" + ] + }, + { + "description": "fs:allow-cache-read -> This allows non-recursive read access to the `$CACHE` folder.", + "type": "string", + "enum": [ + "fs:allow-cache-read" + ] + }, + { + "description": "fs:allow-cache-read-recursive -> This allows full recursive read access to the complete `$CACHE` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-cache-read-recursive" + ] + }, + { + "description": "fs:allow-cache-write -> This allows non-recursive write access to the `$CACHE` folder.", + "type": "string", + "enum": [ + "fs:allow-cache-write" + ] + }, + { + "description": "fs:allow-cache-write-recursive -> This allows full recursive write access to the complete `$CACHE` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-cache-write-recursive" + ] + }, + { + "description": "fs:allow-config-meta -> This allows non-recursive read access to metadata of the `$CONFIG` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-config-meta" + ] + }, + { + "description": "fs:allow-config-meta-recursive -> This allows full recursive read access to metadata of the `$CONFIG` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-config-meta-recursive" + ] + }, + { + "description": "fs:allow-config-read -> This allows non-recursive read access to the `$CONFIG` folder.", + "type": "string", + "enum": [ + "fs:allow-config-read" + ] + }, + { + "description": "fs:allow-config-read-recursive -> This allows full recursive read access to the complete `$CONFIG` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-config-read-recursive" + ] + }, + { + "description": "fs:allow-config-write -> This allows non-recursive write access to the `$CONFIG` folder.", + "type": "string", + "enum": [ + "fs:allow-config-write" + ] + }, + { + "description": "fs:allow-config-write-recursive -> This allows full recursive write access to the complete `$CONFIG` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-config-write-recursive" + ] + }, + { + "description": "fs:allow-data-meta -> This allows non-recursive read access to metadata of the `$DATA` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-data-meta" + ] + }, + { + "description": "fs:allow-data-meta-recursive -> This allows full recursive read access to metadata of the `$DATA` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-data-meta-recursive" + ] + }, + { + "description": "fs:allow-data-read -> This allows non-recursive read access to the `$DATA` folder.", + "type": "string", + "enum": [ + "fs:allow-data-read" + ] + }, + { + "description": "fs:allow-data-read-recursive -> This allows full recursive read access to the complete `$DATA` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-data-read-recursive" + ] + }, + { + "description": "fs:allow-data-write -> This allows non-recursive write access to the `$DATA` folder.", + "type": "string", + "enum": [ + "fs:allow-data-write" + ] + }, + { + "description": "fs:allow-data-write-recursive -> This allows full recursive write access to the complete `$DATA` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-data-write-recursive" + ] + }, + { + "description": "fs:allow-desktop-meta -> This allows non-recursive read access to metadata of the `$DESKTOP` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-desktop-meta" + ] + }, + { + "description": "fs:allow-desktop-meta-recursive -> This allows full recursive read access to metadata of the `$DESKTOP` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-desktop-meta-recursive" + ] + }, + { + "description": "fs:allow-desktop-read -> This allows non-recursive read access to the `$DESKTOP` folder.", + "type": "string", + "enum": [ + "fs:allow-desktop-read" + ] + }, + { + "description": "fs:allow-desktop-read-recursive -> This allows full recursive read access to the complete `$DESKTOP` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-desktop-read-recursive" + ] + }, + { + "description": "fs:allow-desktop-write -> This allows non-recursive write access to the `$DESKTOP` folder.", + "type": "string", + "enum": [ + "fs:allow-desktop-write" + ] + }, + { + "description": "fs:allow-desktop-write-recursive -> This allows full recursive write access to the complete `$DESKTOP` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-desktop-write-recursive" + ] + }, + { + "description": "fs:allow-document-meta -> This allows non-recursive read access to metadata of the `$DOCUMENT` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-document-meta" + ] + }, + { + "description": "fs:allow-document-meta-recursive -> This allows full recursive read access to metadata of the `$DOCUMENT` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-document-meta-recursive" + ] + }, + { + "description": "fs:allow-document-read -> This allows non-recursive read access to the `$DOCUMENT` folder.", + "type": "string", + "enum": [ + "fs:allow-document-read" + ] + }, + { + "description": "fs:allow-document-read-recursive -> This allows full recursive read access to the complete `$DOCUMENT` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-document-read-recursive" + ] + }, + { + "description": "fs:allow-document-write -> This allows non-recursive write access to the `$DOCUMENT` folder.", + "type": "string", + "enum": [ + "fs:allow-document-write" + ] + }, + { + "description": "fs:allow-document-write-recursive -> This allows full recursive write access to the complete `$DOCUMENT` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-document-write-recursive" + ] + }, + { + "description": "fs:allow-download-meta -> This allows non-recursive read access to metadata of the `$DOWNLOAD` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-download-meta" + ] + }, + { + "description": "fs:allow-download-meta-recursive -> This allows full recursive read access to metadata of the `$DOWNLOAD` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-download-meta-recursive" + ] + }, + { + "description": "fs:allow-download-read -> This allows non-recursive read access to the `$DOWNLOAD` folder.", + "type": "string", + "enum": [ + "fs:allow-download-read" + ] + }, + { + "description": "fs:allow-download-read-recursive -> This allows full recursive read access to the complete `$DOWNLOAD` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-download-read-recursive" + ] + }, + { + "description": "fs:allow-download-write -> This allows non-recursive write access to the `$DOWNLOAD` folder.", + "type": "string", + "enum": [ + "fs:allow-download-write" + ] + }, + { + "description": "fs:allow-download-write-recursive -> This allows full recursive write access to the complete `$DOWNLOAD` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-download-write-recursive" + ] + }, + { + "description": "fs:allow-exe-meta -> This allows non-recursive read access to metadata of the `$EXE` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-exe-meta" + ] + }, + { + "description": "fs:allow-exe-meta-recursive -> This allows full recursive read access to metadata of the `$EXE` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-exe-meta-recursive" + ] + }, + { + "description": "fs:allow-exe-read -> This allows non-recursive read access to the `$EXE` folder.", + "type": "string", + "enum": [ + "fs:allow-exe-read" + ] + }, + { + "description": "fs:allow-exe-read-recursive -> This allows full recursive read access to the complete `$EXE` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-exe-read-recursive" + ] + }, + { + "description": "fs:allow-exe-write -> This allows non-recursive write access to the `$EXE` folder.", + "type": "string", + "enum": [ + "fs:allow-exe-write" + ] + }, + { + "description": "fs:allow-exe-write-recursive -> This allows full recursive write access to the complete `$EXE` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-exe-write-recursive" + ] + }, + { + "description": "fs:allow-font-meta -> This allows non-recursive read access to metadata of the `$FONT` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-font-meta" + ] + }, + { + "description": "fs:allow-font-meta-recursive -> This allows full recursive read access to metadata of the `$FONT` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-font-meta-recursive" + ] + }, + { + "description": "fs:allow-font-read -> This allows non-recursive read access to the `$FONT` folder.", + "type": "string", + "enum": [ + "fs:allow-font-read" + ] + }, + { + "description": "fs:allow-font-read-recursive -> This allows full recursive read access to the complete `$FONT` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-font-read-recursive" + ] + }, + { + "description": "fs:allow-font-write -> This allows non-recursive write access to the `$FONT` folder.", + "type": "string", + "enum": [ + "fs:allow-font-write" + ] + }, + { + "description": "fs:allow-font-write-recursive -> This allows full recursive write access to the complete `$FONT` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-font-write-recursive" + ] + }, + { + "description": "fs:allow-home-meta -> This allows non-recursive read access to metadata of the `$HOME` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-home-meta" + ] + }, + { + "description": "fs:allow-home-meta-recursive -> This allows full recursive read access to metadata of the `$HOME` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-home-meta-recursive" + ] + }, + { + "description": "fs:allow-home-read -> This allows non-recursive read access to the `$HOME` folder.", + "type": "string", + "enum": [ + "fs:allow-home-read" + ] + }, + { + "description": "fs:allow-home-read-recursive -> This allows full recursive read access to the complete `$HOME` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-home-read-recursive" + ] + }, + { + "description": "fs:allow-home-write -> This allows non-recursive write access to the `$HOME` folder.", + "type": "string", + "enum": [ + "fs:allow-home-write" + ] + }, + { + "description": "fs:allow-home-write-recursive -> This allows full recursive write access to the complete `$HOME` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-home-write-recursive" + ] + }, + { + "description": "fs:allow-localdata-meta -> This allows non-recursive read access to metadata of the `$LOCALDATA` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-localdata-meta" + ] + }, + { + "description": "fs:allow-localdata-meta-recursive -> This allows full recursive read access to metadata of the `$LOCALDATA` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-localdata-meta-recursive" + ] + }, + { + "description": "fs:allow-localdata-read -> This allows non-recursive read access to the `$LOCALDATA` folder.", + "type": "string", + "enum": [ + "fs:allow-localdata-read" + ] + }, + { + "description": "fs:allow-localdata-read-recursive -> This allows full recursive read access to the complete `$LOCALDATA` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-localdata-read-recursive" + ] + }, + { + "description": "fs:allow-localdata-write -> This allows non-recursive write access to the `$LOCALDATA` folder.", + "type": "string", + "enum": [ + "fs:allow-localdata-write" + ] + }, + { + "description": "fs:allow-localdata-write-recursive -> This allows full recursive write access to the complete `$LOCALDATA` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-localdata-write-recursive" + ] + }, + { + "description": "fs:allow-log-meta -> This allows non-recursive read access to metadata of the `$LOG` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-log-meta" + ] + }, + { + "description": "fs:allow-log-meta-recursive -> This allows full recursive read access to metadata of the `$LOG` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-log-meta-recursive" + ] + }, + { + "description": "fs:allow-log-read -> This allows non-recursive read access to the `$LOG` folder.", + "type": "string", + "enum": [ + "fs:allow-log-read" + ] + }, + { + "description": "fs:allow-log-read-recursive -> This allows full recursive read access to the complete `$LOG` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-log-read-recursive" + ] + }, + { + "description": "fs:allow-log-write -> This allows non-recursive write access to the `$LOG` folder.", + "type": "string", + "enum": [ + "fs:allow-log-write" + ] + }, + { + "description": "fs:allow-log-write-recursive -> This allows full recursive write access to the complete `$LOG` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-log-write-recursive" + ] + }, + { + "description": "fs:allow-picture-meta -> This allows non-recursive read access to metadata of the `$PICTURE` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-picture-meta" + ] + }, + { + "description": "fs:allow-picture-meta-recursive -> This allows full recursive read access to metadata of the `$PICTURE` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-picture-meta-recursive" + ] + }, + { + "description": "fs:allow-picture-read -> This allows non-recursive read access to the `$PICTURE` folder.", + "type": "string", + "enum": [ + "fs:allow-picture-read" + ] + }, + { + "description": "fs:allow-picture-read-recursive -> This allows full recursive read access to the complete `$PICTURE` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-picture-read-recursive" + ] + }, + { + "description": "fs:allow-picture-write -> This allows non-recursive write access to the `$PICTURE` folder.", + "type": "string", + "enum": [ + "fs:allow-picture-write" + ] + }, + { + "description": "fs:allow-picture-write-recursive -> This allows full recursive write access to the complete `$PICTURE` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-picture-write-recursive" + ] + }, + { + "description": "fs:allow-public-meta -> This allows non-recursive read access to metadata of the `$PUBLIC` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-public-meta" + ] + }, + { + "description": "fs:allow-public-meta-recursive -> This allows full recursive read access to metadata of the `$PUBLIC` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-public-meta-recursive" + ] + }, + { + "description": "fs:allow-public-read -> This allows non-recursive read access to the `$PUBLIC` folder.", + "type": "string", + "enum": [ + "fs:allow-public-read" + ] + }, + { + "description": "fs:allow-public-read-recursive -> This allows full recursive read access to the complete `$PUBLIC` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-public-read-recursive" + ] + }, + { + "description": "fs:allow-public-write -> This allows non-recursive write access to the `$PUBLIC` folder.", + "type": "string", + "enum": [ + "fs:allow-public-write" + ] + }, + { + "description": "fs:allow-public-write-recursive -> This allows full recursive write access to the complete `$PUBLIC` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-public-write-recursive" + ] + }, + { + "description": "fs:allow-resource-meta -> This allows non-recursive read access to metadata of the `$RESOURCE` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-resource-meta" + ] + }, + { + "description": "fs:allow-resource-meta-recursive -> This allows full recursive read access to metadata of the `$RESOURCE` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-resource-meta-recursive" + ] + }, + { + "description": "fs:allow-resource-read -> This allows non-recursive read access to the `$RESOURCE` folder.", + "type": "string", + "enum": [ + "fs:allow-resource-read" + ] + }, + { + "description": "fs:allow-resource-read-recursive -> This allows full recursive read access to the complete `$RESOURCE` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-resource-read-recursive" + ] + }, + { + "description": "fs:allow-resource-write -> This allows non-recursive write access to the `$RESOURCE` folder.", + "type": "string", + "enum": [ + "fs:allow-resource-write" + ] + }, + { + "description": "fs:allow-resource-write-recursive -> This allows full recursive write access to the complete `$RESOURCE` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-resource-write-recursive" + ] + }, + { + "description": "fs:allow-runtime-meta -> This allows non-recursive read access to metadata of the `$RUNTIME` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-runtime-meta" + ] + }, + { + "description": "fs:allow-runtime-meta-recursive -> This allows full recursive read access to metadata of the `$RUNTIME` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-runtime-meta-recursive" + ] + }, + { + "description": "fs:allow-runtime-read -> This allows non-recursive read access to the `$RUNTIME` folder.", + "type": "string", + "enum": [ + "fs:allow-runtime-read" + ] + }, + { + "description": "fs:allow-runtime-read-recursive -> This allows full recursive read access to the complete `$RUNTIME` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-runtime-read-recursive" + ] + }, + { + "description": "fs:allow-runtime-write -> This allows non-recursive write access to the `$RUNTIME` folder.", + "type": "string", + "enum": [ + "fs:allow-runtime-write" + ] + }, + { + "description": "fs:allow-runtime-write-recursive -> This allows full recursive write access to the complete `$RUNTIME` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-runtime-write-recursive" + ] + }, + { + "description": "fs:allow-temp-meta -> This allows non-recursive read access to metadata of the `$TEMP` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-temp-meta" + ] + }, + { + "description": "fs:allow-temp-meta-recursive -> This allows full recursive read access to metadata of the `$TEMP` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-temp-meta-recursive" + ] + }, + { + "description": "fs:allow-temp-read -> This allows non-recursive read access to the `$TEMP` folder.", + "type": "string", + "enum": [ + "fs:allow-temp-read" + ] + }, + { + "description": "fs:allow-temp-read-recursive -> This allows full recursive read access to the complete `$TEMP` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-temp-read-recursive" + ] + }, + { + "description": "fs:allow-temp-write -> This allows non-recursive write access to the `$TEMP` folder.", + "type": "string", + "enum": [ + "fs:allow-temp-write" + ] + }, + { + "description": "fs:allow-temp-write-recursive -> This allows full recursive write access to the complete `$TEMP` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-temp-write-recursive" + ] + }, + { + "description": "fs:allow-template-meta -> This allows non-recursive read access to metadata of the `$TEMPLATE` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-template-meta" + ] + }, + { + "description": "fs:allow-template-meta-recursive -> This allows full recursive read access to metadata of the `$TEMPLATE` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-template-meta-recursive" + ] + }, + { + "description": "fs:allow-template-read -> This allows non-recursive read access to the `$TEMPLATE` folder.", + "type": "string", + "enum": [ + "fs:allow-template-read" + ] + }, + { + "description": "fs:allow-template-read-recursive -> This allows full recursive read access to the complete `$TEMPLATE` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-template-read-recursive" + ] + }, + { + "description": "fs:allow-template-write -> This allows non-recursive write access to the `$TEMPLATE` folder.", + "type": "string", + "enum": [ + "fs:allow-template-write" + ] + }, + { + "description": "fs:allow-template-write-recursive -> This allows full recursive write access to the complete `$TEMPLATE` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-template-write-recursive" + ] + }, + { + "description": "fs:allow-video-meta -> This allows non-recursive read access to metadata of the `$VIDEO` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-video-meta" + ] + }, + { + "description": "fs:allow-video-meta-recursive -> This allows full recursive read access to metadata of the `$VIDEO` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-video-meta-recursive" + ] + }, + { + "description": "fs:allow-video-read -> This allows non-recursive read access to the `$VIDEO` folder.", + "type": "string", + "enum": [ + "fs:allow-video-read" + ] + }, + { + "description": "fs:allow-video-read-recursive -> This allows full recursive read access to the complete `$VIDEO` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-video-read-recursive" + ] + }, + { + "description": "fs:allow-video-write -> This allows non-recursive write access to the `$VIDEO` folder.", + "type": "string", + "enum": [ + "fs:allow-video-write" + ] + }, + { + "description": "fs:allow-video-write-recursive -> This allows full recursive write access to the complete `$VIDEO` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-video-write-recursive" + ] + }, + { + "description": "fs:deny-default -> This denies access to dangerous Tauri relevant files and folders by default.", + "type": "string", + "enum": [ + "fs:deny-default" + ] + }, + { + "description": "fs:allow-copy-file -> Enables the copy_file command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:allow-copy-file" + ] + }, + { + "description": "fs:allow-create -> Enables the create command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:allow-create" + ] + }, + { + "description": "fs:allow-exists -> Enables the exists command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:allow-exists" + ] + }, + { + "description": "fs:allow-fstat -> Enables the fstat command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:allow-fstat" + ] + }, + { + "description": "fs:allow-ftruncate -> Enables the ftruncate command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:allow-ftruncate" + ] + }, + { + "description": "fs:allow-lstat -> Enables the lstat command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:allow-lstat" + ] + }, + { + "description": "fs:allow-mkdir -> Enables the mkdir command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:allow-mkdir" + ] + }, + { + "description": "fs:allow-open -> Enables the open command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:allow-open" + ] + }, + { + "description": "fs:allow-read -> Enables the read command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:allow-read" + ] + }, + { + "description": "fs:allow-read-dir -> Enables the read_dir command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:allow-read-dir" + ] + }, + { + "description": "fs:allow-read-file -> Enables the read_file command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:allow-read-file" + ] + }, + { + "description": "fs:allow-read-text-file -> Enables the read_text_file command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:allow-read-text-file" + ] + }, + { + "description": "fs:allow-read-text-file-lines -> Enables the read_text_file_lines command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:allow-read-text-file-lines" + ] + }, + { + "description": "fs:allow-read-text-file-lines-next -> Enables the read_text_file_lines_next command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:allow-read-text-file-lines-next" + ] + }, + { + "description": "fs:allow-remove -> Enables the remove command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:allow-remove" + ] + }, + { + "description": "fs:allow-rename -> Enables the rename command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:allow-rename" + ] + }, + { + "description": "fs:allow-seek -> Enables the seek command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:allow-seek" + ] + }, + { + "description": "fs:allow-stat -> Enables the stat command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:allow-stat" + ] + }, + { + "description": "fs:allow-truncate -> Enables the truncate command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:allow-truncate" + ] + }, + { + "description": "fs:allow-unwatch -> Enables the unwatch command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:allow-unwatch" + ] + }, + { + "description": "fs:allow-watch -> Enables the watch command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:allow-watch" + ] + }, + { + "description": "fs:allow-write -> Enables the write command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:allow-write" + ] + }, + { + "description": "fs:allow-write-file -> Enables the write_file command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:allow-write-file" + ] + }, + { + "description": "fs:allow-write-text-file -> Enables the write_text_file command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:allow-write-text-file" + ] + }, + { + "description": "fs:create-app-specific-dirs -> This permissions allows to create the application specific directories.\n", + "type": "string", + "enum": [ + "fs:create-app-specific-dirs" + ] + }, + { + "description": "fs:deny-copy-file -> Denies the copy_file command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:deny-copy-file" + ] + }, + { + "description": "fs:deny-create -> Denies the create command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:deny-create" + ] + }, + { + "description": "fs:deny-exists -> Denies the exists command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:deny-exists" + ] + }, + { + "description": "fs:deny-fstat -> Denies the fstat command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:deny-fstat" + ] + }, + { + "description": "fs:deny-ftruncate -> Denies the ftruncate command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:deny-ftruncate" + ] + }, + { + "description": "fs:deny-lstat -> Denies the lstat command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:deny-lstat" + ] + }, + { + "description": "fs:deny-mkdir -> Denies the mkdir command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:deny-mkdir" + ] + }, + { + "description": "fs:deny-open -> Denies the open command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:deny-open" + ] + }, + { + "description": "fs:deny-read -> Denies the read command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:deny-read" + ] + }, + { + "description": "fs:deny-read-dir -> Denies the read_dir command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:deny-read-dir" + ] + }, + { + "description": "fs:deny-read-file -> Denies the read_file command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:deny-read-file" + ] + }, + { + "description": "fs:deny-read-text-file -> Denies the read_text_file command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:deny-read-text-file" + ] + }, + { + "description": "fs:deny-read-text-file-lines -> Denies the read_text_file_lines command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:deny-read-text-file-lines" + ] + }, + { + "description": "fs:deny-read-text-file-lines-next -> Denies the read_text_file_lines_next command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:deny-read-text-file-lines-next" + ] + }, + { + "description": "fs:deny-remove -> Denies the remove command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:deny-remove" + ] + }, + { + "description": "fs:deny-rename -> Denies the rename command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:deny-rename" + ] + }, + { + "description": "fs:deny-seek -> Denies the seek command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:deny-seek" + ] + }, + { + "description": "fs:deny-stat -> Denies the stat command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:deny-stat" + ] + }, + { + "description": "fs:deny-truncate -> Denies the truncate command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:deny-truncate" + ] + }, + { + "description": "fs:deny-unwatch -> Denies the unwatch command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:deny-unwatch" + ] + }, + { + "description": "fs:deny-watch -> Denies the watch command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:deny-watch" + ] + }, + { + "description": "fs:deny-webview-data-linux -> This denies read access to the\n`$APPLOCALDATA` folder on linux as the webview data and configuration values are stored here.\nAllowing access can lead to sensitive information disclosure and should be well considered.", + "type": "string", + "enum": [ + "fs:deny-webview-data-linux" + ] + }, + { + "description": "fs:deny-webview-data-windows -> This denies read access to the\n`$APPLOCALDATA/EBWebView` folder on windows as the webview data and configuration values are stored here.\nAllowing access can lead to sensitive information disclosure and should be well considered.", + "type": "string", + "enum": [ + "fs:deny-webview-data-windows" + ] + }, + { + "description": "fs:deny-write -> Denies the write command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:deny-write" + ] + }, + { + "description": "fs:deny-write-file -> Denies the write_file command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:deny-write-file" + ] + }, + { + "description": "fs:deny-write-text-file -> Denies the write_text_file command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:deny-write-text-file" + ] + }, + { + "description": "fs:read-all -> This enables all read related commands without any pre-configured accessible paths.", + "type": "string", + "enum": [ + "fs:read-all" + ] + }, + { + "description": "fs:read-app-specific-dirs-recursive -> This permission allows recursive read functionality on the application\nspecific base directories. \n", + "type": "string", + "enum": [ + "fs:read-app-specific-dirs-recursive" + ] + }, + { + "description": "fs:read-dirs -> This enables directory read and file metadata related commands without any pre-configured accessible paths.", + "type": "string", + "enum": [ + "fs:read-dirs" + ] + }, + { + "description": "fs:read-files -> This enables file read related commands without any pre-configured accessible paths.", + "type": "string", + "enum": [ + "fs:read-files" + ] + }, + { + "description": "fs:read-meta -> This enables all index or metadata related commands without any pre-configured accessible paths.", + "type": "string", + "enum": [ + "fs:read-meta" + ] + }, + { + "description": "fs:scope -> An empty permission you can use to modify the global scope.", + "type": "string", + "enum": [ + "fs:scope" + ] + }, + { + "description": "fs:scope-app -> This scope permits access to all files and list content of top level directories in the `$APP`folder.", + "type": "string", + "enum": [ + "fs:scope-app" + ] + }, + { + "description": "fs:scope-app-index -> This scope permits to list all files and folders in the `$APP`folder.", + "type": "string", + "enum": [ + "fs:scope-app-index" + ] + }, + { + "description": "fs:scope-app-recursive -> This scope permits recursive access to the complete `$APP` folder, including sub directories and files.", + "type": "string", + "enum": [ + "fs:scope-app-recursive" + ] + }, + { + "description": "fs:scope-appcache -> This scope permits access to all files and list content of top level directories in the `$APPCACHE`folder.", + "type": "string", + "enum": [ + "fs:scope-appcache" + ] + }, + { + "description": "fs:scope-appcache-index -> This scope permits to list all files and folders in the `$APPCACHE`folder.", + "type": "string", + "enum": [ + "fs:scope-appcache-index" + ] + }, + { + "description": "fs:scope-appcache-recursive -> This scope permits recursive access to the complete `$APPCACHE` folder, including sub directories and files.", + "type": "string", + "enum": [ + "fs:scope-appcache-recursive" + ] + }, + { + "description": "fs:scope-appconfig -> This scope permits access to all files and list content of top level directories in the `$APPCONFIG`folder.", + "type": "string", + "enum": [ + "fs:scope-appconfig" + ] + }, + { + "description": "fs:scope-appconfig-index -> This scope permits to list all files and folders in the `$APPCONFIG`folder.", + "type": "string", + "enum": [ + "fs:scope-appconfig-index" + ] + }, + { + "description": "fs:scope-appconfig-recursive -> This scope permits recursive access to the complete `$APPCONFIG` folder, including sub directories and files.", + "type": "string", + "enum": [ + "fs:scope-appconfig-recursive" + ] + }, + { + "description": "fs:scope-appdata -> This scope permits access to all files and list content of top level directories in the `$APPDATA`folder.", + "type": "string", + "enum": [ + "fs:scope-appdata" + ] + }, + { + "description": "fs:scope-appdata-index -> This scope permits to list all files and folders in the `$APPDATA`folder.", + "type": "string", + "enum": [ + "fs:scope-appdata-index" + ] + }, + { + "description": "fs:scope-appdata-recursive -> This scope permits recursive access to the complete `$APPDATA` folder, including sub directories and files.", + "type": "string", + "enum": [ + "fs:scope-appdata-recursive" + ] + }, + { + "description": "fs:scope-applocaldata -> This scope permits access to all files and list content of top level directories in the `$APPLOCALDATA`folder.", + "type": "string", + "enum": [ + "fs:scope-applocaldata" + ] + }, + { + "description": "fs:scope-applocaldata-index -> This scope permits to list all files and folders in the `$APPLOCALDATA`folder.", + "type": "string", + "enum": [ + "fs:scope-applocaldata-index" + ] + }, + { + "description": "fs:scope-applocaldata-recursive -> This scope permits recursive access to the complete `$APPLOCALDATA` folder, including sub directories and files.", + "type": "string", + "enum": [ + "fs:scope-applocaldata-recursive" + ] + }, + { + "description": "fs:scope-applog -> This scope permits access to all files and list content of top level directories in the `$APPLOG`folder.", + "type": "string", + "enum": [ + "fs:scope-applog" + ] + }, + { + "description": "fs:scope-applog-index -> This scope permits to list all files and folders in the `$APPLOG`folder.", + "type": "string", + "enum": [ + "fs:scope-applog-index" + ] + }, + { + "description": "fs:scope-applog-recursive -> This scope permits recursive access to the complete `$APPLOG` folder, including sub directories and files.", + "type": "string", + "enum": [ + "fs:scope-applog-recursive" + ] + }, + { + "description": "fs:scope-audio -> This scope permits access to all files and list content of top level directories in the `$AUDIO`folder.", + "type": "string", + "enum": [ + "fs:scope-audio" + ] + }, + { + "description": "fs:scope-audio-index -> This scope permits to list all files and folders in the `$AUDIO`folder.", + "type": "string", + "enum": [ + "fs:scope-audio-index" + ] + }, + { + "description": "fs:scope-audio-recursive -> This scope permits recursive access to the complete `$AUDIO` folder, including sub directories and files.", + "type": "string", + "enum": [ + "fs:scope-audio-recursive" + ] + }, + { + "description": "fs:scope-cache -> This scope permits access to all files and list content of top level directories in the `$CACHE`folder.", + "type": "string", + "enum": [ + "fs:scope-cache" + ] + }, + { + "description": "fs:scope-cache-index -> This scope permits to list all files and folders in the `$CACHE`folder.", + "type": "string", + "enum": [ + "fs:scope-cache-index" + ] + }, + { + "description": "fs:scope-cache-recursive -> This scope permits recursive access to the complete `$CACHE` folder, including sub directories and files.", + "type": "string", + "enum": [ + "fs:scope-cache-recursive" + ] + }, + { + "description": "fs:scope-config -> This scope permits access to all files and list content of top level directories in the `$CONFIG`folder.", + "type": "string", + "enum": [ + "fs:scope-config" + ] + }, + { + "description": "fs:scope-config-index -> This scope permits to list all files and folders in the `$CONFIG`folder.", + "type": "string", + "enum": [ + "fs:scope-config-index" + ] + }, + { + "description": "fs:scope-config-recursive -> This scope permits recursive access to the complete `$CONFIG` folder, including sub directories and files.", + "type": "string", + "enum": [ + "fs:scope-config-recursive" + ] + }, + { + "description": "fs:scope-data -> This scope permits access to all files and list content of top level directories in the `$DATA`folder.", + "type": "string", + "enum": [ + "fs:scope-data" + ] + }, + { + "description": "fs:scope-data-index -> This scope permits to list all files and folders in the `$DATA`folder.", + "type": "string", + "enum": [ + "fs:scope-data-index" + ] + }, + { + "description": "fs:scope-data-recursive -> This scope permits recursive access to the complete `$DATA` folder, including sub directories and files.", + "type": "string", + "enum": [ + "fs:scope-data-recursive" + ] + }, + { + "description": "fs:scope-desktop -> This scope permits access to all files and list content of top level directories in the `$DESKTOP`folder.", + "type": "string", + "enum": [ + "fs:scope-desktop" + ] + }, + { + "description": "fs:scope-desktop-index -> This scope permits to list all files and folders in the `$DESKTOP`folder.", + "type": "string", + "enum": [ + "fs:scope-desktop-index" + ] + }, + { + "description": "fs:scope-desktop-recursive -> This scope permits recursive access to the complete `$DESKTOP` folder, including sub directories and files.", + "type": "string", + "enum": [ + "fs:scope-desktop-recursive" + ] + }, + { + "description": "fs:scope-document -> This scope permits access to all files and list content of top level directories in the `$DOCUMENT`folder.", + "type": "string", + "enum": [ + "fs:scope-document" + ] + }, + { + "description": "fs:scope-document-index -> This scope permits to list all files and folders in the `$DOCUMENT`folder.", + "type": "string", + "enum": [ + "fs:scope-document-index" + ] + }, + { + "description": "fs:scope-document-recursive -> This scope permits recursive access to the complete `$DOCUMENT` folder, including sub directories and files.", + "type": "string", + "enum": [ + "fs:scope-document-recursive" + ] + }, + { + "description": "fs:scope-download -> This scope permits access to all files and list content of top level directories in the `$DOWNLOAD`folder.", + "type": "string", + "enum": [ + "fs:scope-download" + ] + }, + { + "description": "fs:scope-download-index -> This scope permits to list all files and folders in the `$DOWNLOAD`folder.", + "type": "string", + "enum": [ + "fs:scope-download-index" + ] + }, + { + "description": "fs:scope-download-recursive -> This scope permits recursive access to the complete `$DOWNLOAD` folder, including sub directories and files.", + "type": "string", + "enum": [ + "fs:scope-download-recursive" + ] + }, + { + "description": "fs:scope-exe -> This scope permits access to all files and list content of top level directories in the `$EXE`folder.", + "type": "string", + "enum": [ + "fs:scope-exe" + ] + }, + { + "description": "fs:scope-exe-index -> This scope permits to list all files and folders in the `$EXE`folder.", + "type": "string", + "enum": [ + "fs:scope-exe-index" + ] + }, + { + "description": "fs:scope-exe-recursive -> This scope permits recursive access to the complete `$EXE` folder, including sub directories and files.", + "type": "string", + "enum": [ + "fs:scope-exe-recursive" + ] + }, + { + "description": "fs:scope-font -> This scope permits access to all files and list content of top level directories in the `$FONT`folder.", + "type": "string", + "enum": [ + "fs:scope-font" + ] + }, + { + "description": "fs:scope-font-index -> This scope permits to list all files and folders in the `$FONT`folder.", + "type": "string", + "enum": [ + "fs:scope-font-index" + ] + }, + { + "description": "fs:scope-font-recursive -> This scope permits recursive access to the complete `$FONT` folder, including sub directories and files.", + "type": "string", + "enum": [ + "fs:scope-font-recursive" + ] + }, + { + "description": "fs:scope-home -> This scope permits access to all files and list content of top level directories in the `$HOME`folder.", + "type": "string", + "enum": [ + "fs:scope-home" + ] + }, + { + "description": "fs:scope-home-index -> This scope permits to list all files and folders in the `$HOME`folder.", + "type": "string", + "enum": [ + "fs:scope-home-index" + ] + }, + { + "description": "fs:scope-home-recursive -> This scope permits recursive access to the complete `$HOME` folder, including sub directories and files.", + "type": "string", + "enum": [ + "fs:scope-home-recursive" + ] + }, + { + "description": "fs:scope-localdata -> This scope permits access to all files and list content of top level directories in the `$LOCALDATA`folder.", + "type": "string", + "enum": [ + "fs:scope-localdata" + ] + }, + { + "description": "fs:scope-localdata-index -> This scope permits to list all files and folders in the `$LOCALDATA`folder.", + "type": "string", + "enum": [ + "fs:scope-localdata-index" + ] + }, + { + "description": "fs:scope-localdata-recursive -> This scope permits recursive access to the complete `$LOCALDATA` folder, including sub directories and files.", + "type": "string", + "enum": [ + "fs:scope-localdata-recursive" + ] + }, + { + "description": "fs:scope-log -> This scope permits access to all files and list content of top level directories in the `$LOG`folder.", + "type": "string", + "enum": [ + "fs:scope-log" + ] + }, + { + "description": "fs:scope-log-index -> This scope permits to list all files and folders in the `$LOG`folder.", + "type": "string", + "enum": [ + "fs:scope-log-index" + ] + }, + { + "description": "fs:scope-log-recursive -> This scope permits recursive access to the complete `$LOG` folder, including sub directories and files.", + "type": "string", + "enum": [ + "fs:scope-log-recursive" + ] + }, + { + "description": "fs:scope-picture -> This scope permits access to all files and list content of top level directories in the `$PICTURE`folder.", + "type": "string", + "enum": [ + "fs:scope-picture" + ] + }, + { + "description": "fs:scope-picture-index -> This scope permits to list all files and folders in the `$PICTURE`folder.", + "type": "string", + "enum": [ + "fs:scope-picture-index" + ] + }, + { + "description": "fs:scope-picture-recursive -> This scope permits recursive access to the complete `$PICTURE` folder, including sub directories and files.", + "type": "string", + "enum": [ + "fs:scope-picture-recursive" + ] + }, + { + "description": "fs:scope-public -> This scope permits access to all files and list content of top level directories in the `$PUBLIC`folder.", + "type": "string", + "enum": [ + "fs:scope-public" + ] + }, + { + "description": "fs:scope-public-index -> This scope permits to list all files and folders in the `$PUBLIC`folder.", + "type": "string", + "enum": [ + "fs:scope-public-index" + ] + }, + { + "description": "fs:scope-public-recursive -> This scope permits recursive access to the complete `$PUBLIC` folder, including sub directories and files.", + "type": "string", + "enum": [ + "fs:scope-public-recursive" + ] + }, + { + "description": "fs:scope-resource -> This scope permits access to all files and list content of top level directories in the `$RESOURCE`folder.", + "type": "string", + "enum": [ + "fs:scope-resource" + ] + }, + { + "description": "fs:scope-resource-index -> This scope permits to list all files and folders in the `$RESOURCE`folder.", + "type": "string", + "enum": [ + "fs:scope-resource-index" + ] + }, + { + "description": "fs:scope-resource-recursive -> This scope permits recursive access to the complete `$RESOURCE` folder, including sub directories and files.", + "type": "string", + "enum": [ + "fs:scope-resource-recursive" + ] + }, + { + "description": "fs:scope-runtime -> This scope permits access to all files and list content of top level directories in the `$RUNTIME`folder.", + "type": "string", + "enum": [ + "fs:scope-runtime" + ] + }, + { + "description": "fs:scope-runtime-index -> This scope permits to list all files and folders in the `$RUNTIME`folder.", + "type": "string", + "enum": [ + "fs:scope-runtime-index" + ] + }, + { + "description": "fs:scope-runtime-recursive -> This scope permits recursive access to the complete `$RUNTIME` folder, including sub directories and files.", + "type": "string", + "enum": [ + "fs:scope-runtime-recursive" + ] + }, + { + "description": "fs:scope-temp -> This scope permits access to all files and list content of top level directories in the `$TEMP`folder.", + "type": "string", + "enum": [ + "fs:scope-temp" + ] + }, + { + "description": "fs:scope-temp-index -> This scope permits to list all files and folders in the `$TEMP`folder.", + "type": "string", + "enum": [ + "fs:scope-temp-index" + ] + }, + { + "description": "fs:scope-temp-recursive -> This scope permits recursive access to the complete `$TEMP` folder, including sub directories and files.", + "type": "string", + "enum": [ + "fs:scope-temp-recursive" + ] + }, + { + "description": "fs:scope-template -> This scope permits access to all files and list content of top level directories in the `$TEMPLATE`folder.", + "type": "string", + "enum": [ + "fs:scope-template" + ] + }, + { + "description": "fs:scope-template-index -> This scope permits to list all files and folders in the `$TEMPLATE`folder.", + "type": "string", + "enum": [ + "fs:scope-template-index" + ] + }, + { + "description": "fs:scope-template-recursive -> This scope permits recursive access to the complete `$TEMPLATE` folder, including sub directories and files.", + "type": "string", + "enum": [ + "fs:scope-template-recursive" + ] + }, + { + "description": "fs:scope-video -> This scope permits access to all files and list content of top level directories in the `$VIDEO`folder.", + "type": "string", + "enum": [ + "fs:scope-video" + ] + }, + { + "description": "fs:scope-video-index -> This scope permits to list all files and folders in the `$VIDEO`folder.", + "type": "string", + "enum": [ + "fs:scope-video-index" + ] + }, + { + "description": "fs:scope-video-recursive -> This scope permits recursive access to the complete `$VIDEO` folder, including sub directories and files.", + "type": "string", + "enum": [ + "fs:scope-video-recursive" + ] + }, + { + "description": "fs:write-all -> This enables all write related commands without any pre-configured accessible paths.", + "type": "string", + "enum": [ + "fs:write-all" + ] + }, + { + "description": "fs:write-files -> This enables all file write related commands without any pre-configured accessible paths.", + "type": "string", + "enum": [ + "fs:write-files" + ] + } + ] + }, + "allow": { + "items": { + "title": "FsScopeEntry", + "description": "FS scope entry.", + "anyOf": [ + { + "description": "FS scope path.", + "type": "string" + }, + { + "type": "object", + "required": [ + "path" + ], + "properties": { + "path": { + "description": "FS scope path.", + "type": "string" + } + } + } + ] + } + }, + "deny": { + "items": { + "title": "FsScopeEntry", + "description": "FS scope entry.", + "anyOf": [ + { + "description": "FS scope path.", + "type": "string" + }, + { + "type": "object", + "required": [ + "path" + ], + "properties": { + "path": { + "description": "FS scope path.", + "type": "string" + } + } + } + ] + } + } + } + }, + { + "type": "object", + "required": [ + "identifier" + ], + "properties": { + "identifier": { + "oneOf": [ + { + "description": "shell:default -> This permission set configures which\nshell functionality is exposed by default.\n\n#### Granted Permissions\n\nIt allows to use the `open` functionality without any specific\nscope pre-configured. It will allow opening `http(s)://`,\n`tel:` and `mailto:` links.\n", + "type": "string", + "enum": [ + "shell:default" + ] + }, + { + "description": "shell:allow-execute -> Enables the execute command without any pre-configured scope.", + "type": "string", + "enum": [ + "shell:allow-execute" + ] + }, + { + "description": "shell:allow-kill -> Enables the kill command without any pre-configured scope.", + "type": "string", + "enum": [ + "shell:allow-kill" + ] + }, + { + "description": "shell:allow-open -> Enables the open command without any pre-configured scope.", + "type": "string", + "enum": [ + "shell:allow-open" + ] + }, + { + "description": "shell:allow-spawn -> Enables the spawn command without any pre-configured scope.", + "type": "string", + "enum": [ + "shell:allow-spawn" + ] + }, + { + "description": "shell:allow-stdin-write -> Enables the stdin_write command without any pre-configured scope.", + "type": "string", + "enum": [ + "shell:allow-stdin-write" + ] + }, + { + "description": "shell:deny-execute -> Denies the execute command without any pre-configured scope.", + "type": "string", + "enum": [ + "shell:deny-execute" + ] + }, + { + "description": "shell:deny-kill -> Denies the kill command without any pre-configured scope.", + "type": "string", + "enum": [ + "shell:deny-kill" + ] + }, + { + "description": "shell:deny-open -> Denies the open command without any pre-configured scope.", + "type": "string", + "enum": [ + "shell:deny-open" + ] + }, + { + "description": "shell:deny-spawn -> Denies the spawn command without any pre-configured scope.", + "type": "string", + "enum": [ + "shell:deny-spawn" + ] + }, + { + "description": "shell:deny-stdin-write -> Denies the stdin_write command without any pre-configured scope.", + "type": "string", + "enum": [ + "shell:deny-stdin-write" + ] + } + ] + }, + "allow": { + "items": { + "title": "Entry", + "description": "A command allowed to be executed by the webview API.", + "type": "object", + "required": [ + "args", + "cmd", + "name", + "sidecar" + ], + "properties": { + "args": { + "description": "The allowed arguments for the command execution.", + "allOf": [ + { + "$ref": "#/definitions/ShellAllowedArgs" + } + ] + }, + "cmd": { + "description": "The command name. It can start with a variable that resolves to a system base directory. The variables are: `$AUDIO`, `$CACHE`, `$CONFIG`, `$DATA`, `$LOCALDATA`, `$DESKTOP`, `$DOCUMENT`, `$DOWNLOAD`, `$EXE`, `$FONT`, `$HOME`, `$PICTURE`, `$PUBLIC`, `$RUNTIME`, `$TEMPLATE`, `$VIDEO`, `$RESOURCE`, `$APP`, `$LOG`, `$TEMP`, `$APPCONFIG`, `$APPDATA`, `$APPLOCALDATA`, `$APPCACHE`, `$APPLOG`.", + "type": "string" + }, + "name": { + "description": "The name for this allowed shell command configuration.\n\nThis name will be used inside of the webview API to call this command along with any specified arguments.", + "type": "string" + }, + "sidecar": { + "description": "If this command is a sidecar command.", + "type": "boolean" + } + } + } + }, + "deny": { + "items": { + "title": "Entry", + "description": "A command allowed to be executed by the webview API.", + "type": "object", + "required": [ + "args", + "cmd", + "name", + "sidecar" + ], + "properties": { + "args": { + "description": "The allowed arguments for the command execution.", + "allOf": [ + { + "$ref": "#/definitions/ShellAllowedArgs" + } + ] + }, + "cmd": { + "description": "The command name. It can start with a variable that resolves to a system base directory. The variables are: `$AUDIO`, `$CACHE`, `$CONFIG`, `$DATA`, `$LOCALDATA`, `$DESKTOP`, `$DOCUMENT`, `$DOWNLOAD`, `$EXE`, `$FONT`, `$HOME`, `$PICTURE`, `$PUBLIC`, `$RUNTIME`, `$TEMPLATE`, `$VIDEO`, `$RESOURCE`, `$APP`, `$LOG`, `$TEMP`, `$APPCONFIG`, `$APPDATA`, `$APPLOCALDATA`, `$APPCACHE`, `$APPLOG`.", + "type": "string" + }, + "name": { + "description": "The name for this allowed shell command configuration.\n\nThis name will be used inside of the webview API to call this command along with any specified arguments.", + "type": "string" + }, + "sidecar": { + "description": "If this command is a sidecar command.", + "type": "boolean" + } + } + } + } + } + } + ] + } + ] + }, + "Identifier": { + "oneOf": [ + { + "description": "clipboard-manager:default -> No features are enabled by default, as we believe\nthe clipboard can be inherently dangerous and it is \napplication specific if read and/or write access is needed.\n\nClipboard interaction needs to be explicitly enabled.\n", + "type": "string", + "enum": [ + "clipboard-manager:default" + ] + }, + { + "description": "clipboard-manager:allow-clear -> Enables the clear command without any pre-configured scope.", + "type": "string", + "enum": [ + "clipboard-manager:allow-clear" + ] + }, + { + "description": "clipboard-manager:allow-read-image -> Enables the read_image command without any pre-configured scope.", + "type": "string", + "enum": [ + "clipboard-manager:allow-read-image" + ] + }, + { + "description": "clipboard-manager:allow-read-text -> Enables the read_text command without any pre-configured scope.", + "type": "string", + "enum": [ + "clipboard-manager:allow-read-text" + ] + }, + { + "description": "clipboard-manager:allow-write-html -> Enables the write_html command without any pre-configured scope.", + "type": "string", + "enum": [ + "clipboard-manager:allow-write-html" + ] + }, + { + "description": "clipboard-manager:allow-write-image -> Enables the write_image command without any pre-configured scope.", + "type": "string", + "enum": [ + "clipboard-manager:allow-write-image" + ] + }, + { + "description": "clipboard-manager:allow-write-text -> Enables the write_text command without any pre-configured scope.", + "type": "string", + "enum": [ + "clipboard-manager:allow-write-text" + ] + }, + { + "description": "clipboard-manager:deny-clear -> Denies the clear command without any pre-configured scope.", + "type": "string", + "enum": [ + "clipboard-manager:deny-clear" + ] + }, + { + "description": "clipboard-manager:deny-read-image -> Denies the read_image command without any pre-configured scope.", + "type": "string", + "enum": [ + "clipboard-manager:deny-read-image" + ] + }, + { + "description": "clipboard-manager:deny-read-text -> Denies the read_text command without any pre-configured scope.", + "type": "string", + "enum": [ + "clipboard-manager:deny-read-text" + ] + }, + { + "description": "clipboard-manager:deny-write-html -> Denies the write_html command without any pre-configured scope.", + "type": "string", + "enum": [ + "clipboard-manager:deny-write-html" + ] + }, + { + "description": "clipboard-manager:deny-write-image -> Denies the write_image command without any pre-configured scope.", + "type": "string", + "enum": [ + "clipboard-manager:deny-write-image" + ] + }, + { + "description": "clipboard-manager:deny-write-text -> Denies the write_text command without any pre-configured scope.", + "type": "string", + "enum": [ + "clipboard-manager:deny-write-text" + ] + }, + { + "description": "core:app:default -> Default permissions for the plugin.", + "type": "string", + "enum": [ + "core:app:default" + ] + }, + { + "description": "core:app:allow-app-hide -> Enables the app_hide command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:app:allow-app-hide" + ] + }, + { + "description": "core:app:allow-app-show -> Enables the app_show command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:app:allow-app-show" + ] + }, + { + "description": "core:app:allow-default-window-icon -> Enables the default_window_icon command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:app:allow-default-window-icon" + ] + }, + { + "description": "core:app:allow-name -> Enables the name command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:app:allow-name" + ] + }, + { + "description": "core:app:allow-tauri-version -> Enables the tauri_version command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:app:allow-tauri-version" + ] + }, + { + "description": "core:app:allow-version -> Enables the version command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:app:allow-version" + ] + }, + { + "description": "core:app:deny-app-hide -> Denies the app_hide command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:app:deny-app-hide" + ] + }, + { + "description": "core:app:deny-app-show -> Denies the app_show command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:app:deny-app-show" + ] + }, + { + "description": "core:app:deny-default-window-icon -> Denies the default_window_icon command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:app:deny-default-window-icon" + ] + }, + { + "description": "core:app:deny-name -> Denies the name command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:app:deny-name" + ] + }, + { + "description": "core:app:deny-tauri-version -> Denies the tauri_version command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:app:deny-tauri-version" + ] + }, + { + "description": "core:app:deny-version -> Denies the version command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:app:deny-version" + ] + }, + { + "description": "core:event:default -> Default permissions for the plugin.", + "type": "string", + "enum": [ + "core:event:default" + ] + }, + { + "description": "core:event:allow-emit -> Enables the emit command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:event:allow-emit" + ] + }, + { + "description": "core:event:allow-emit-to -> Enables the emit_to command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:event:allow-emit-to" + ] + }, + { + "description": "core:event:allow-listen -> Enables the listen command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:event:allow-listen" + ] + }, + { + "description": "core:event:allow-unlisten -> Enables the unlisten command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:event:allow-unlisten" + ] + }, + { + "description": "core:event:deny-emit -> Denies the emit command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:event:deny-emit" + ] + }, + { + "description": "core:event:deny-emit-to -> Denies the emit_to command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:event:deny-emit-to" + ] + }, + { + "description": "core:event:deny-listen -> Denies the listen command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:event:deny-listen" + ] + }, + { + "description": "core:event:deny-unlisten -> Denies the unlisten command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:event:deny-unlisten" + ] + }, + { + "description": "core:image:default -> Default permissions for the plugin.", + "type": "string", + "enum": [ + "core:image:default" + ] + }, + { + "description": "core:image:allow-from-bytes -> Enables the from_bytes command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:image:allow-from-bytes" + ] + }, + { + "description": "core:image:allow-from-path -> Enables the from_path command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:image:allow-from-path" + ] + }, + { + "description": "core:image:allow-new -> Enables the new command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:image:allow-new" + ] + }, + { + "description": "core:image:allow-rgba -> Enables the rgba command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:image:allow-rgba" + ] + }, + { + "description": "core:image:allow-size -> Enables the size command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:image:allow-size" + ] + }, + { + "description": "core:image:deny-from-bytes -> Denies the from_bytes command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:image:deny-from-bytes" + ] + }, + { + "description": "core:image:deny-from-path -> Denies the from_path command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:image:deny-from-path" + ] + }, + { + "description": "core:image:deny-new -> Denies the new command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:image:deny-new" + ] + }, + { + "description": "core:image:deny-rgba -> Denies the rgba command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:image:deny-rgba" + ] + }, + { + "description": "core:image:deny-size -> Denies the size command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:image:deny-size" + ] + }, + { + "description": "core:menu:default -> Default permissions for the plugin.", + "type": "string", + "enum": [ + "core:menu:default" + ] + }, + { + "description": "core:menu:allow-append -> Enables the append command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:menu:allow-append" + ] + }, + { + "description": "core:menu:allow-create-default -> Enables the create_default command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:menu:allow-create-default" + ] + }, + { + "description": "core:menu:allow-get -> Enables the get command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:menu:allow-get" + ] + }, + { + "description": "core:menu:allow-insert -> Enables the insert command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:menu:allow-insert" + ] + }, + { + "description": "core:menu:allow-is-checked -> Enables the is_checked command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:menu:allow-is-checked" + ] + }, + { + "description": "core:menu:allow-is-enabled -> Enables the is_enabled command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:menu:allow-is-enabled" + ] + }, + { + "description": "core:menu:allow-items -> Enables the items command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:menu:allow-items" + ] + }, + { + "description": "core:menu:allow-new -> Enables the new command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:menu:allow-new" + ] + }, + { + "description": "core:menu:allow-popup -> Enables the popup command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:menu:allow-popup" + ] + }, + { + "description": "core:menu:allow-prepend -> Enables the prepend command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:menu:allow-prepend" + ] + }, + { + "description": "core:menu:allow-remove -> Enables the remove command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:menu:allow-remove" + ] + }, + { + "description": "core:menu:allow-remove-at -> Enables the remove_at command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:menu:allow-remove-at" + ] + }, + { + "description": "core:menu:allow-set-accelerator -> Enables the set_accelerator command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:menu:allow-set-accelerator" + ] + }, + { + "description": "core:menu:allow-set-as-app-menu -> Enables the set_as_app_menu command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:menu:allow-set-as-app-menu" + ] + }, + { + "description": "core:menu:allow-set-as-help-menu-for-nsapp -> Enables the set_as_help_menu_for_nsapp command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:menu:allow-set-as-help-menu-for-nsapp" + ] + }, + { + "description": "core:menu:allow-set-as-window-menu -> Enables the set_as_window_menu command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:menu:allow-set-as-window-menu" + ] + }, + { + "description": "core:menu:allow-set-as-windows-menu-for-nsapp -> Enables the set_as_windows_menu_for_nsapp command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:menu:allow-set-as-windows-menu-for-nsapp" + ] + }, + { + "description": "core:menu:allow-set-checked -> Enables the set_checked command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:menu:allow-set-checked" + ] + }, + { + "description": "core:menu:allow-set-enabled -> Enables the set_enabled command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:menu:allow-set-enabled" + ] + }, + { + "description": "core:menu:allow-set-icon -> Enables the set_icon command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:menu:allow-set-icon" + ] + }, + { + "description": "core:menu:allow-set-text -> Enables the set_text command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:menu:allow-set-text" + ] + }, + { + "description": "core:menu:allow-text -> Enables the text command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:menu:allow-text" + ] + }, + { + "description": "core:menu:deny-append -> Denies the append command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:menu:deny-append" + ] + }, + { + "description": "core:menu:deny-create-default -> Denies the create_default command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:menu:deny-create-default" + ] + }, + { + "description": "core:menu:deny-get -> Denies the get command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:menu:deny-get" + ] + }, + { + "description": "core:menu:deny-insert -> Denies the insert command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:menu:deny-insert" + ] + }, + { + "description": "core:menu:deny-is-checked -> Denies the is_checked command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:menu:deny-is-checked" + ] + }, + { + "description": "core:menu:deny-is-enabled -> Denies the is_enabled command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:menu:deny-is-enabled" + ] + }, + { + "description": "core:menu:deny-items -> Denies the items command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:menu:deny-items" + ] + }, + { + "description": "core:menu:deny-new -> Denies the new command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:menu:deny-new" + ] + }, + { + "description": "core:menu:deny-popup -> Denies the popup command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:menu:deny-popup" + ] + }, + { + "description": "core:menu:deny-prepend -> Denies the prepend command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:menu:deny-prepend" + ] + }, + { + "description": "core:menu:deny-remove -> Denies the remove command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:menu:deny-remove" + ] + }, + { + "description": "core:menu:deny-remove-at -> Denies the remove_at command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:menu:deny-remove-at" + ] + }, + { + "description": "core:menu:deny-set-accelerator -> Denies the set_accelerator command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:menu:deny-set-accelerator" + ] + }, + { + "description": "core:menu:deny-set-as-app-menu -> Denies the set_as_app_menu command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:menu:deny-set-as-app-menu" + ] + }, + { + "description": "core:menu:deny-set-as-help-menu-for-nsapp -> Denies the set_as_help_menu_for_nsapp command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:menu:deny-set-as-help-menu-for-nsapp" + ] + }, + { + "description": "core:menu:deny-set-as-window-menu -> Denies the set_as_window_menu command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:menu:deny-set-as-window-menu" + ] + }, + { + "description": "core:menu:deny-set-as-windows-menu-for-nsapp -> Denies the set_as_windows_menu_for_nsapp command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:menu:deny-set-as-windows-menu-for-nsapp" + ] + }, + { + "description": "core:menu:deny-set-checked -> Denies the set_checked command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:menu:deny-set-checked" + ] + }, + { + "description": "core:menu:deny-set-enabled -> Denies the set_enabled command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:menu:deny-set-enabled" + ] + }, + { + "description": "core:menu:deny-set-icon -> Denies the set_icon command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:menu:deny-set-icon" + ] + }, + { + "description": "core:menu:deny-set-text -> Denies the set_text command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:menu:deny-set-text" + ] + }, + { + "description": "core:menu:deny-text -> Denies the text command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:menu:deny-text" + ] + }, + { + "description": "core:path:default -> Default permissions for the plugin.", + "type": "string", + "enum": [ + "core:path:default" + ] + }, + { + "description": "core:path:allow-basename -> Enables the basename command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:path:allow-basename" + ] + }, + { + "description": "core:path:allow-dirname -> Enables the dirname command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:path:allow-dirname" + ] + }, + { + "description": "core:path:allow-extname -> Enables the extname command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:path:allow-extname" + ] + }, + { + "description": "core:path:allow-is-absolute -> Enables the is_absolute command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:path:allow-is-absolute" + ] + }, + { + "description": "core:path:allow-join -> Enables the join command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:path:allow-join" + ] + }, + { + "description": "core:path:allow-normalize -> Enables the normalize command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:path:allow-normalize" + ] + }, + { + "description": "core:path:allow-resolve -> Enables the resolve command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:path:allow-resolve" + ] + }, + { + "description": "core:path:allow-resolve-directory -> Enables the resolve_directory command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:path:allow-resolve-directory" + ] + }, + { + "description": "core:path:deny-basename -> Denies the basename command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:path:deny-basename" + ] + }, + { + "description": "core:path:deny-dirname -> Denies the dirname command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:path:deny-dirname" + ] + }, + { + "description": "core:path:deny-extname -> Denies the extname command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:path:deny-extname" + ] + }, + { + "description": "core:path:deny-is-absolute -> Denies the is_absolute command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:path:deny-is-absolute" + ] + }, + { + "description": "core:path:deny-join -> Denies the join command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:path:deny-join" + ] + }, + { + "description": "core:path:deny-normalize -> Denies the normalize command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:path:deny-normalize" + ] + }, + { + "description": "core:path:deny-resolve -> Denies the resolve command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:path:deny-resolve" + ] + }, + { + "description": "core:path:deny-resolve-directory -> Denies the resolve_directory command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:path:deny-resolve-directory" + ] + }, + { + "description": "core:resources:default -> Default permissions for the plugin.", + "type": "string", + "enum": [ + "core:resources:default" + ] + }, + { + "description": "core:resources:allow-close -> Enables the close command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:resources:allow-close" + ] + }, + { + "description": "core:resources:deny-close -> Denies the close command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:resources:deny-close" + ] + }, + { + "description": "core:tray:default -> Default permissions for the plugin.", + "type": "string", + "enum": [ + "core:tray:default" + ] + }, + { + "description": "core:tray:allow-get-by-id -> Enables the get_by_id command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:tray:allow-get-by-id" + ] + }, + { + "description": "core:tray:allow-new -> Enables the new command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:tray:allow-new" + ] + }, + { + "description": "core:tray:allow-remove-by-id -> Enables the remove_by_id command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:tray:allow-remove-by-id" + ] + }, + { + "description": "core:tray:allow-set-icon -> Enables the set_icon command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:tray:allow-set-icon" + ] + }, + { + "description": "core:tray:allow-set-icon-as-template -> Enables the set_icon_as_template command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:tray:allow-set-icon-as-template" + ] + }, + { + "description": "core:tray:allow-set-menu -> Enables the set_menu command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:tray:allow-set-menu" + ] + }, + { + "description": "core:tray:allow-set-show-menu-on-left-click -> Enables the set_show_menu_on_left_click command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:tray:allow-set-show-menu-on-left-click" + ] + }, + { + "description": "core:tray:allow-set-temp-dir-path -> Enables the set_temp_dir_path command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:tray:allow-set-temp-dir-path" + ] + }, + { + "description": "core:tray:allow-set-title -> Enables the set_title command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:tray:allow-set-title" + ] + }, + { + "description": "core:tray:allow-set-tooltip -> Enables the set_tooltip command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:tray:allow-set-tooltip" + ] + }, + { + "description": "core:tray:allow-set-visible -> Enables the set_visible command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:tray:allow-set-visible" + ] + }, + { + "description": "core:tray:deny-get-by-id -> Denies the get_by_id command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:tray:deny-get-by-id" + ] + }, + { + "description": "core:tray:deny-new -> Denies the new command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:tray:deny-new" + ] + }, + { + "description": "core:tray:deny-remove-by-id -> Denies the remove_by_id command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:tray:deny-remove-by-id" + ] + }, + { + "description": "core:tray:deny-set-icon -> Denies the set_icon command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:tray:deny-set-icon" + ] + }, + { + "description": "core:tray:deny-set-icon-as-template -> Denies the set_icon_as_template command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:tray:deny-set-icon-as-template" + ] + }, + { + "description": "core:tray:deny-set-menu -> Denies the set_menu command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:tray:deny-set-menu" + ] + }, + { + "description": "core:tray:deny-set-show-menu-on-left-click -> Denies the set_show_menu_on_left_click command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:tray:deny-set-show-menu-on-left-click" + ] + }, + { + "description": "core:tray:deny-set-temp-dir-path -> Denies the set_temp_dir_path command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:tray:deny-set-temp-dir-path" + ] + }, + { + "description": "core:tray:deny-set-title -> Denies the set_title command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:tray:deny-set-title" + ] + }, + { + "description": "core:tray:deny-set-tooltip -> Denies the set_tooltip command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:tray:deny-set-tooltip" + ] + }, + { + "description": "core:tray:deny-set-visible -> Denies the set_visible command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:tray:deny-set-visible" + ] + }, + { + "description": "core:webview:default -> Default permissions for the plugin.", + "type": "string", + "enum": [ + "core:webview:default" + ] + }, + { + "description": "core:webview:allow-create-webview -> Enables the create_webview command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:webview:allow-create-webview" + ] + }, + { + "description": "core:webview:allow-create-webview-window -> Enables the create_webview_window command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:webview:allow-create-webview-window" + ] + }, + { + "description": "core:webview:allow-get-all-webviews -> Enables the get_all_webviews command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:webview:allow-get-all-webviews" + ] + }, + { + "description": "core:webview:allow-internal-toggle-devtools -> Enables the internal_toggle_devtools command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:webview:allow-internal-toggle-devtools" + ] + }, + { + "description": "core:webview:allow-print -> Enables the print command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:webview:allow-print" + ] + }, + { + "description": "core:webview:allow-reparent -> Enables the reparent command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:webview:allow-reparent" + ] + }, + { + "description": "core:webview:allow-set-webview-focus -> Enables the set_webview_focus command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:webview:allow-set-webview-focus" + ] + }, + { + "description": "core:webview:allow-set-webview-position -> Enables the set_webview_position command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:webview:allow-set-webview-position" + ] + }, + { + "description": "core:webview:allow-set-webview-size -> Enables the set_webview_size command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:webview:allow-set-webview-size" + ] + }, + { + "description": "core:webview:allow-set-webview-zoom -> Enables the set_webview_zoom command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:webview:allow-set-webview-zoom" + ] + }, + { + "description": "core:webview:allow-webview-close -> Enables the webview_close command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:webview:allow-webview-close" + ] + }, + { + "description": "core:webview:allow-webview-position -> Enables the webview_position command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:webview:allow-webview-position" + ] + }, + { + "description": "core:webview:allow-webview-size -> Enables the webview_size command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:webview:allow-webview-size" + ] + }, + { + "description": "core:webview:deny-create-webview -> Denies the create_webview command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:webview:deny-create-webview" + ] + }, + { + "description": "core:webview:deny-create-webview-window -> Denies the create_webview_window command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:webview:deny-create-webview-window" + ] + }, + { + "description": "core:webview:deny-get-all-webviews -> Denies the get_all_webviews command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:webview:deny-get-all-webviews" + ] + }, + { + "description": "core:webview:deny-internal-toggle-devtools -> Denies the internal_toggle_devtools command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:webview:deny-internal-toggle-devtools" + ] + }, + { + "description": "core:webview:deny-print -> Denies the print command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:webview:deny-print" + ] + }, + { + "description": "core:webview:deny-reparent -> Denies the reparent command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:webview:deny-reparent" + ] + }, + { + "description": "core:webview:deny-set-webview-focus -> Denies the set_webview_focus command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:webview:deny-set-webview-focus" + ] + }, + { + "description": "core:webview:deny-set-webview-position -> Denies the set_webview_position command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:webview:deny-set-webview-position" + ] + }, + { + "description": "core:webview:deny-set-webview-size -> Denies the set_webview_size command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:webview:deny-set-webview-size" + ] + }, + { + "description": "core:webview:deny-set-webview-zoom -> Denies the set_webview_zoom command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:webview:deny-set-webview-zoom" + ] + }, + { + "description": "core:webview:deny-webview-close -> Denies the webview_close command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:webview:deny-webview-close" + ] + }, + { + "description": "core:webview:deny-webview-position -> Denies the webview_position command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:webview:deny-webview-position" + ] + }, + { + "description": "core:webview:deny-webview-size -> Denies the webview_size command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:webview:deny-webview-size" + ] + }, + { + "description": "core:window:default -> Default permissions for the plugin.", + "type": "string", + "enum": [ + "core:window:default" + ] + }, + { + "description": "core:window:allow-available-monitors -> Enables the available_monitors command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:allow-available-monitors" + ] + }, + { + "description": "core:window:allow-center -> Enables the center command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:allow-center" + ] + }, + { + "description": "core:window:allow-close -> Enables the close command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:allow-close" + ] + }, + { + "description": "core:window:allow-create -> Enables the create command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:allow-create" + ] + }, + { + "description": "core:window:allow-current-monitor -> Enables the current_monitor command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:allow-current-monitor" + ] + }, + { + "description": "core:window:allow-cursor-position -> Enables the cursor_position command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:allow-cursor-position" + ] + }, + { + "description": "core:window:allow-destroy -> Enables the destroy command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:allow-destroy" + ] + }, + { + "description": "core:window:allow-get-all-windows -> Enables the get_all_windows command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:allow-get-all-windows" + ] + }, + { + "description": "core:window:allow-hide -> Enables the hide command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:allow-hide" + ] + }, + { + "description": "core:window:allow-inner-position -> Enables the inner_position command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:allow-inner-position" + ] + }, + { + "description": "core:window:allow-inner-size -> Enables the inner_size command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:allow-inner-size" + ] + }, + { + "description": "core:window:allow-internal-toggle-maximize -> Enables the internal_toggle_maximize command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:allow-internal-toggle-maximize" + ] + }, + { + "description": "core:window:allow-is-closable -> Enables the is_closable command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:allow-is-closable" + ] + }, + { + "description": "core:window:allow-is-decorated -> Enables the is_decorated command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:allow-is-decorated" + ] + }, + { + "description": "core:window:allow-is-focused -> Enables the is_focused command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:allow-is-focused" + ] + }, + { + "description": "core:window:allow-is-fullscreen -> Enables the is_fullscreen command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:allow-is-fullscreen" + ] + }, + { + "description": "core:window:allow-is-maximizable -> Enables the is_maximizable command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:allow-is-maximizable" + ] + }, + { + "description": "core:window:allow-is-maximized -> Enables the is_maximized command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:allow-is-maximized" + ] + }, + { + "description": "core:window:allow-is-minimizable -> Enables the is_minimizable command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:allow-is-minimizable" + ] + }, + { + "description": "core:window:allow-is-minimized -> Enables the is_minimized command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:allow-is-minimized" + ] + }, + { + "description": "core:window:allow-is-resizable -> Enables the is_resizable command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:allow-is-resizable" + ] + }, + { + "description": "core:window:allow-is-visible -> Enables the is_visible command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:allow-is-visible" + ] + }, + { + "description": "core:window:allow-maximize -> Enables the maximize command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:allow-maximize" + ] + }, + { + "description": "core:window:allow-minimize -> Enables the minimize command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:allow-minimize" + ] + }, + { + "description": "core:window:allow-monitor-from-point -> Enables the monitor_from_point command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:allow-monitor-from-point" + ] + }, + { + "description": "core:window:allow-outer-position -> Enables the outer_position command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:allow-outer-position" + ] + }, + { + "description": "core:window:allow-outer-size -> Enables the outer_size command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:allow-outer-size" + ] + }, + { + "description": "core:window:allow-primary-monitor -> Enables the primary_monitor command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:allow-primary-monitor" + ] + }, + { + "description": "core:window:allow-request-user-attention -> Enables the request_user_attention command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:allow-request-user-attention" + ] + }, + { + "description": "core:window:allow-scale-factor -> Enables the scale_factor command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:allow-scale-factor" + ] + }, + { + "description": "core:window:allow-set-always-on-bottom -> Enables the set_always_on_bottom command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:allow-set-always-on-bottom" + ] + }, + { + "description": "core:window:allow-set-always-on-top -> Enables the set_always_on_top command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:allow-set-always-on-top" + ] + }, + { + "description": "core:window:allow-set-closable -> Enables the set_closable command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:allow-set-closable" + ] + }, + { + "description": "core:window:allow-set-content-protected -> Enables the set_content_protected command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:allow-set-content-protected" + ] + }, + { + "description": "core:window:allow-set-cursor-grab -> Enables the set_cursor_grab command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:allow-set-cursor-grab" + ] + }, + { + "description": "core:window:allow-set-cursor-icon -> Enables the set_cursor_icon command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:allow-set-cursor-icon" + ] + }, + { + "description": "core:window:allow-set-cursor-position -> Enables the set_cursor_position command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:allow-set-cursor-position" + ] + }, + { + "description": "core:window:allow-set-cursor-visible -> Enables the set_cursor_visible command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:allow-set-cursor-visible" + ] + }, + { + "description": "core:window:allow-set-decorations -> Enables the set_decorations command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:allow-set-decorations" + ] + }, + { + "description": "core:window:allow-set-effects -> Enables the set_effects command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:allow-set-effects" + ] + }, + { + "description": "core:window:allow-set-focus -> Enables the set_focus command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:allow-set-focus" + ] + }, + { + "description": "core:window:allow-set-fullscreen -> Enables the set_fullscreen command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:allow-set-fullscreen" + ] + }, + { + "description": "core:window:allow-set-icon -> Enables the set_icon command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:allow-set-icon" + ] + }, + { + "description": "core:window:allow-set-ignore-cursor-events -> Enables the set_ignore_cursor_events command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:allow-set-ignore-cursor-events" + ] + }, + { + "description": "core:window:allow-set-max-size -> Enables the set_max_size command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:allow-set-max-size" + ] + }, + { + "description": "core:window:allow-set-maximizable -> Enables the set_maximizable command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:allow-set-maximizable" + ] + }, + { + "description": "core:window:allow-set-min-size -> Enables the set_min_size command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:allow-set-min-size" + ] + }, + { + "description": "core:window:allow-set-minimizable -> Enables the set_minimizable command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:allow-set-minimizable" + ] + }, + { + "description": "core:window:allow-set-position -> Enables the set_position command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:allow-set-position" + ] + }, + { + "description": "core:window:allow-set-progress-bar -> Enables the set_progress_bar command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:allow-set-progress-bar" + ] + }, + { + "description": "core:window:allow-set-resizable -> Enables the set_resizable command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:allow-set-resizable" + ] + }, + { + "description": "core:window:allow-set-shadow -> Enables the set_shadow command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:allow-set-shadow" + ] + }, + { + "description": "core:window:allow-set-size -> Enables the set_size command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:allow-set-size" + ] + }, + { + "description": "core:window:allow-set-size-constraints -> Enables the set_size_constraints command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:allow-set-size-constraints" + ] + }, + { + "description": "core:window:allow-set-skip-taskbar -> Enables the set_skip_taskbar command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:allow-set-skip-taskbar" + ] + }, + { + "description": "core:window:allow-set-title -> Enables the set_title command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:allow-set-title" + ] + }, + { + "description": "core:window:allow-set-title-bar-style -> Enables the set_title_bar_style command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:allow-set-title-bar-style" + ] + }, + { + "description": "core:window:allow-set-visible-on-all-workspaces -> Enables the set_visible_on_all_workspaces command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:allow-set-visible-on-all-workspaces" + ] + }, + { + "description": "core:window:allow-show -> Enables the show command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:allow-show" + ] + }, + { + "description": "core:window:allow-start-dragging -> Enables the start_dragging command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:allow-start-dragging" + ] + }, + { + "description": "core:window:allow-start-resize-dragging -> Enables the start_resize_dragging command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:allow-start-resize-dragging" + ] + }, + { + "description": "core:window:allow-theme -> Enables the theme command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:allow-theme" + ] + }, + { + "description": "core:window:allow-title -> Enables the title command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:allow-title" + ] + }, + { + "description": "core:window:allow-toggle-maximize -> Enables the toggle_maximize command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:allow-toggle-maximize" + ] + }, + { + "description": "core:window:allow-unmaximize -> Enables the unmaximize command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:allow-unmaximize" + ] + }, + { + "description": "core:window:allow-unminimize -> Enables the unminimize command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:allow-unminimize" + ] + }, + { + "description": "core:window:deny-available-monitors -> Denies the available_monitors command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:deny-available-monitors" + ] + }, + { + "description": "core:window:deny-center -> Denies the center command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:deny-center" + ] + }, + { + "description": "core:window:deny-close -> Denies the close command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:deny-close" + ] + }, + { + "description": "core:window:deny-create -> Denies the create command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:deny-create" + ] + }, + { + "description": "core:window:deny-current-monitor -> Denies the current_monitor command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:deny-current-monitor" + ] + }, + { + "description": "core:window:deny-cursor-position -> Denies the cursor_position command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:deny-cursor-position" + ] + }, + { + "description": "core:window:deny-destroy -> Denies the destroy command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:deny-destroy" + ] + }, + { + "description": "core:window:deny-get-all-windows -> Denies the get_all_windows command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:deny-get-all-windows" + ] + }, + { + "description": "core:window:deny-hide -> Denies the hide command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:deny-hide" + ] + }, + { + "description": "core:window:deny-inner-position -> Denies the inner_position command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:deny-inner-position" + ] + }, + { + "description": "core:window:deny-inner-size -> Denies the inner_size command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:deny-inner-size" + ] + }, + { + "description": "core:window:deny-internal-toggle-maximize -> Denies the internal_toggle_maximize command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:deny-internal-toggle-maximize" + ] + }, + { + "description": "core:window:deny-is-closable -> Denies the is_closable command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:deny-is-closable" + ] + }, + { + "description": "core:window:deny-is-decorated -> Denies the is_decorated command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:deny-is-decorated" + ] + }, + { + "description": "core:window:deny-is-focused -> Denies the is_focused command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:deny-is-focused" + ] + }, + { + "description": "core:window:deny-is-fullscreen -> Denies the is_fullscreen command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:deny-is-fullscreen" + ] + }, + { + "description": "core:window:deny-is-maximizable -> Denies the is_maximizable command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:deny-is-maximizable" + ] + }, + { + "description": "core:window:deny-is-maximized -> Denies the is_maximized command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:deny-is-maximized" + ] + }, + { + "description": "core:window:deny-is-minimizable -> Denies the is_minimizable command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:deny-is-minimizable" + ] + }, + { + "description": "core:window:deny-is-minimized -> Denies the is_minimized command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:deny-is-minimized" + ] + }, + { + "description": "core:window:deny-is-resizable -> Denies the is_resizable command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:deny-is-resizable" + ] + }, + { + "description": "core:window:deny-is-visible -> Denies the is_visible command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:deny-is-visible" + ] + }, + { + "description": "core:window:deny-maximize -> Denies the maximize command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:deny-maximize" + ] + }, + { + "description": "core:window:deny-minimize -> Denies the minimize command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:deny-minimize" + ] + }, + { + "description": "core:window:deny-monitor-from-point -> Denies the monitor_from_point command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:deny-monitor-from-point" + ] + }, + { + "description": "core:window:deny-outer-position -> Denies the outer_position command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:deny-outer-position" + ] + }, + { + "description": "core:window:deny-outer-size -> Denies the outer_size command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:deny-outer-size" + ] + }, + { + "description": "core:window:deny-primary-monitor -> Denies the primary_monitor command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:deny-primary-monitor" + ] + }, + { + "description": "core:window:deny-request-user-attention -> Denies the request_user_attention command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:deny-request-user-attention" + ] + }, + { + "description": "core:window:deny-scale-factor -> Denies the scale_factor command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:deny-scale-factor" + ] + }, + { + "description": "core:window:deny-set-always-on-bottom -> Denies the set_always_on_bottom command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:deny-set-always-on-bottom" + ] + }, + { + "description": "core:window:deny-set-always-on-top -> Denies the set_always_on_top command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:deny-set-always-on-top" + ] + }, + { + "description": "core:window:deny-set-closable -> Denies the set_closable command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:deny-set-closable" + ] + }, + { + "description": "core:window:deny-set-content-protected -> Denies the set_content_protected command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:deny-set-content-protected" + ] + }, + { + "description": "core:window:deny-set-cursor-grab -> Denies the set_cursor_grab command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:deny-set-cursor-grab" + ] + }, + { + "description": "core:window:deny-set-cursor-icon -> Denies the set_cursor_icon command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:deny-set-cursor-icon" + ] + }, + { + "description": "core:window:deny-set-cursor-position -> Denies the set_cursor_position command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:deny-set-cursor-position" + ] + }, + { + "description": "core:window:deny-set-cursor-visible -> Denies the set_cursor_visible command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:deny-set-cursor-visible" + ] + }, + { + "description": "core:window:deny-set-decorations -> Denies the set_decorations command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:deny-set-decorations" + ] + }, + { + "description": "core:window:deny-set-effects -> Denies the set_effects command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:deny-set-effects" + ] + }, + { + "description": "core:window:deny-set-focus -> Denies the set_focus command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:deny-set-focus" + ] + }, + { + "description": "core:window:deny-set-fullscreen -> Denies the set_fullscreen command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:deny-set-fullscreen" + ] + }, + { + "description": "core:window:deny-set-icon -> Denies the set_icon command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:deny-set-icon" + ] + }, + { + "description": "core:window:deny-set-ignore-cursor-events -> Denies the set_ignore_cursor_events command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:deny-set-ignore-cursor-events" + ] + }, + { + "description": "core:window:deny-set-max-size -> Denies the set_max_size command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:deny-set-max-size" + ] + }, + { + "description": "core:window:deny-set-maximizable -> Denies the set_maximizable command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:deny-set-maximizable" + ] + }, + { + "description": "core:window:deny-set-min-size -> Denies the set_min_size command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:deny-set-min-size" + ] + }, + { + "description": "core:window:deny-set-minimizable -> Denies the set_minimizable command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:deny-set-minimizable" + ] + }, + { + "description": "core:window:deny-set-position -> Denies the set_position command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:deny-set-position" + ] + }, + { + "description": "core:window:deny-set-progress-bar -> Denies the set_progress_bar command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:deny-set-progress-bar" + ] + }, + { + "description": "core:window:deny-set-resizable -> Denies the set_resizable command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:deny-set-resizable" + ] + }, + { + "description": "core:window:deny-set-shadow -> Denies the set_shadow command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:deny-set-shadow" + ] + }, + { + "description": "core:window:deny-set-size -> Denies the set_size command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:deny-set-size" + ] + }, + { + "description": "core:window:deny-set-size-constraints -> Denies the set_size_constraints command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:deny-set-size-constraints" + ] + }, + { + "description": "core:window:deny-set-skip-taskbar -> Denies the set_skip_taskbar command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:deny-set-skip-taskbar" + ] + }, + { + "description": "core:window:deny-set-title -> Denies the set_title command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:deny-set-title" + ] + }, + { + "description": "core:window:deny-set-title-bar-style -> Denies the set_title_bar_style command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:deny-set-title-bar-style" + ] + }, + { + "description": "core:window:deny-set-visible-on-all-workspaces -> Denies the set_visible_on_all_workspaces command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:deny-set-visible-on-all-workspaces" + ] + }, + { + "description": "core:window:deny-show -> Denies the show command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:deny-show" + ] + }, + { + "description": "core:window:deny-start-dragging -> Denies the start_dragging command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:deny-start-dragging" + ] + }, + { + "description": "core:window:deny-start-resize-dragging -> Denies the start_resize_dragging command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:deny-start-resize-dragging" + ] + }, + { + "description": "core:window:deny-theme -> Denies the theme command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:deny-theme" + ] + }, + { + "description": "core:window:deny-title -> Denies the title command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:deny-title" + ] + }, + { + "description": "core:window:deny-toggle-maximize -> Denies the toggle_maximize command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:deny-toggle-maximize" + ] + }, + { + "description": "core:window:deny-unmaximize -> Denies the unmaximize command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:deny-unmaximize" + ] + }, + { + "description": "core:window:deny-unminimize -> Denies the unminimize command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:deny-unminimize" + ] + }, + { + "description": "dialog:default -> This permission set configures the types of dialogs\navailable from the dialog plugin.\n\n#### Granted Permissions\n\nAll dialog types are enabled.\n\n\n", + "type": "string", + "enum": [ + "dialog:default" + ] + }, + { + "description": "dialog:allow-ask -> Enables the ask command without any pre-configured scope.", + "type": "string", + "enum": [ + "dialog:allow-ask" + ] + }, + { + "description": "dialog:allow-confirm -> Enables the confirm command without any pre-configured scope.", + "type": "string", + "enum": [ + "dialog:allow-confirm" + ] + }, + { + "description": "dialog:allow-message -> Enables the message command without any pre-configured scope.", + "type": "string", + "enum": [ + "dialog:allow-message" + ] + }, + { + "description": "dialog:allow-open -> Enables the open command without any pre-configured scope.", + "type": "string", + "enum": [ + "dialog:allow-open" + ] + }, + { + "description": "dialog:allow-save -> Enables the save command without any pre-configured scope.", + "type": "string", + "enum": [ + "dialog:allow-save" + ] + }, + { + "description": "dialog:deny-ask -> Denies the ask command without any pre-configured scope.", + "type": "string", + "enum": [ + "dialog:deny-ask" + ] + }, + { + "description": "dialog:deny-confirm -> Denies the confirm command without any pre-configured scope.", + "type": "string", + "enum": [ + "dialog:deny-confirm" + ] + }, + { + "description": "dialog:deny-message -> Denies the message command without any pre-configured scope.", + "type": "string", + "enum": [ + "dialog:deny-message" + ] + }, + { + "description": "dialog:deny-open -> Denies the open command without any pre-configured scope.", + "type": "string", + "enum": [ + "dialog:deny-open" + ] + }, + { + "description": "dialog:deny-save -> Denies the save command without any pre-configured scope.", + "type": "string", + "enum": [ + "dialog:deny-save" + ] + }, + { + "description": "fs:allow-app-meta -> This allows non-recursive read access to metadata of the `$APP` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-app-meta" + ] + }, + { + "description": "fs:allow-app-meta-recursive -> This allows full recursive read access to metadata of the `$APP` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-app-meta-recursive" + ] + }, + { + "description": "fs:allow-app-read -> This allows non-recursive read access to the `$APP` folder.", + "type": "string", + "enum": [ + "fs:allow-app-read" + ] + }, + { + "description": "fs:allow-app-read-recursive -> This allows full recursive read access to the complete `$APP` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-app-read-recursive" + ] + }, + { + "description": "fs:allow-app-write -> This allows non-recursive write access to the `$APP` folder.", + "type": "string", + "enum": [ + "fs:allow-app-write" + ] + }, + { + "description": "fs:allow-app-write-recursive -> This allows full recursive write access to the complete `$APP` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-app-write-recursive" + ] + }, + { + "description": "fs:allow-appcache-meta -> This allows non-recursive read access to metadata of the `$APPCACHE` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-appcache-meta" + ] + }, + { + "description": "fs:allow-appcache-meta-recursive -> This allows full recursive read access to metadata of the `$APPCACHE` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-appcache-meta-recursive" + ] + }, + { + "description": "fs:allow-appcache-read -> This allows non-recursive read access to the `$APPCACHE` folder.", + "type": "string", + "enum": [ + "fs:allow-appcache-read" + ] + }, + { + "description": "fs:allow-appcache-read-recursive -> This allows full recursive read access to the complete `$APPCACHE` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-appcache-read-recursive" + ] + }, + { + "description": "fs:allow-appcache-write -> This allows non-recursive write access to the `$APPCACHE` folder.", + "type": "string", + "enum": [ + "fs:allow-appcache-write" + ] + }, + { + "description": "fs:allow-appcache-write-recursive -> This allows full recursive write access to the complete `$APPCACHE` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-appcache-write-recursive" + ] + }, + { + "description": "fs:allow-appconfig-meta -> This allows non-recursive read access to metadata of the `$APPCONFIG` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-appconfig-meta" + ] + }, + { + "description": "fs:allow-appconfig-meta-recursive -> This allows full recursive read access to metadata of the `$APPCONFIG` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-appconfig-meta-recursive" + ] + }, + { + "description": "fs:allow-appconfig-read -> This allows non-recursive read access to the `$APPCONFIG` folder.", + "type": "string", + "enum": [ + "fs:allow-appconfig-read" + ] + }, + { + "description": "fs:allow-appconfig-read-recursive -> This allows full recursive read access to the complete `$APPCONFIG` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-appconfig-read-recursive" + ] + }, + { + "description": "fs:allow-appconfig-write -> This allows non-recursive write access to the `$APPCONFIG` folder.", + "type": "string", + "enum": [ + "fs:allow-appconfig-write" + ] + }, + { + "description": "fs:allow-appconfig-write-recursive -> This allows full recursive write access to the complete `$APPCONFIG` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-appconfig-write-recursive" + ] + }, + { + "description": "fs:allow-appdata-meta -> This allows non-recursive read access to metadata of the `$APPDATA` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-appdata-meta" + ] + }, + { + "description": "fs:allow-appdata-meta-recursive -> This allows full recursive read access to metadata of the `$APPDATA` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-appdata-meta-recursive" + ] + }, + { + "description": "fs:allow-appdata-read -> This allows non-recursive read access to the `$APPDATA` folder.", + "type": "string", + "enum": [ + "fs:allow-appdata-read" + ] + }, + { + "description": "fs:allow-appdata-read-recursive -> This allows full recursive read access to the complete `$APPDATA` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-appdata-read-recursive" + ] + }, + { + "description": "fs:allow-appdata-write -> This allows non-recursive write access to the `$APPDATA` folder.", + "type": "string", + "enum": [ + "fs:allow-appdata-write" + ] + }, + { + "description": "fs:allow-appdata-write-recursive -> This allows full recursive write access to the complete `$APPDATA` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-appdata-write-recursive" + ] + }, + { + "description": "fs:allow-applocaldata-meta -> This allows non-recursive read access to metadata of the `$APPLOCALDATA` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-applocaldata-meta" + ] + }, + { + "description": "fs:allow-applocaldata-meta-recursive -> This allows full recursive read access to metadata of the `$APPLOCALDATA` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-applocaldata-meta-recursive" + ] + }, + { + "description": "fs:allow-applocaldata-read -> This allows non-recursive read access to the `$APPLOCALDATA` folder.", + "type": "string", + "enum": [ + "fs:allow-applocaldata-read" + ] + }, + { + "description": "fs:allow-applocaldata-read-recursive -> This allows full recursive read access to the complete `$APPLOCALDATA` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-applocaldata-read-recursive" + ] + }, + { + "description": "fs:allow-applocaldata-write -> This allows non-recursive write access to the `$APPLOCALDATA` folder.", + "type": "string", + "enum": [ + "fs:allow-applocaldata-write" + ] + }, + { + "description": "fs:allow-applocaldata-write-recursive -> This allows full recursive write access to the complete `$APPLOCALDATA` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-applocaldata-write-recursive" + ] + }, + { + "description": "fs:allow-applog-meta -> This allows non-recursive read access to metadata of the `$APPLOG` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-applog-meta" + ] + }, + { + "description": "fs:allow-applog-meta-recursive -> This allows full recursive read access to metadata of the `$APPLOG` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-applog-meta-recursive" + ] + }, + { + "description": "fs:allow-applog-read -> This allows non-recursive read access to the `$APPLOG` folder.", + "type": "string", + "enum": [ + "fs:allow-applog-read" + ] + }, + { + "description": "fs:allow-applog-read-recursive -> This allows full recursive read access to the complete `$APPLOG` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-applog-read-recursive" + ] + }, + { + "description": "fs:allow-applog-write -> This allows non-recursive write access to the `$APPLOG` folder.", + "type": "string", + "enum": [ + "fs:allow-applog-write" + ] + }, + { + "description": "fs:allow-applog-write-recursive -> This allows full recursive write access to the complete `$APPLOG` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-applog-write-recursive" + ] + }, + { + "description": "fs:allow-audio-meta -> This allows non-recursive read access to metadata of the `$AUDIO` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-audio-meta" + ] + }, + { + "description": "fs:allow-audio-meta-recursive -> This allows full recursive read access to metadata of the `$AUDIO` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-audio-meta-recursive" + ] + }, + { + "description": "fs:allow-audio-read -> This allows non-recursive read access to the `$AUDIO` folder.", + "type": "string", + "enum": [ + "fs:allow-audio-read" + ] + }, + { + "description": "fs:allow-audio-read-recursive -> This allows full recursive read access to the complete `$AUDIO` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-audio-read-recursive" + ] + }, + { + "description": "fs:allow-audio-write -> This allows non-recursive write access to the `$AUDIO` folder.", + "type": "string", + "enum": [ + "fs:allow-audio-write" + ] + }, + { + "description": "fs:allow-audio-write-recursive -> This allows full recursive write access to the complete `$AUDIO` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-audio-write-recursive" + ] + }, + { + "description": "fs:allow-cache-meta -> This allows non-recursive read access to metadata of the `$CACHE` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-cache-meta" + ] + }, + { + "description": "fs:allow-cache-meta-recursive -> This allows full recursive read access to metadata of the `$CACHE` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-cache-meta-recursive" + ] + }, + { + "description": "fs:allow-cache-read -> This allows non-recursive read access to the `$CACHE` folder.", + "type": "string", + "enum": [ + "fs:allow-cache-read" + ] + }, + { + "description": "fs:allow-cache-read-recursive -> This allows full recursive read access to the complete `$CACHE` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-cache-read-recursive" + ] + }, + { + "description": "fs:allow-cache-write -> This allows non-recursive write access to the `$CACHE` folder.", + "type": "string", + "enum": [ + "fs:allow-cache-write" + ] + }, + { + "description": "fs:allow-cache-write-recursive -> This allows full recursive write access to the complete `$CACHE` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-cache-write-recursive" + ] + }, + { + "description": "fs:allow-config-meta -> This allows non-recursive read access to metadata of the `$CONFIG` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-config-meta" + ] + }, + { + "description": "fs:allow-config-meta-recursive -> This allows full recursive read access to metadata of the `$CONFIG` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-config-meta-recursive" + ] + }, + { + "description": "fs:allow-config-read -> This allows non-recursive read access to the `$CONFIG` folder.", + "type": "string", + "enum": [ + "fs:allow-config-read" + ] + }, + { + "description": "fs:allow-config-read-recursive -> This allows full recursive read access to the complete `$CONFIG` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-config-read-recursive" + ] + }, + { + "description": "fs:allow-config-write -> This allows non-recursive write access to the `$CONFIG` folder.", + "type": "string", + "enum": [ + "fs:allow-config-write" + ] + }, + { + "description": "fs:allow-config-write-recursive -> This allows full recursive write access to the complete `$CONFIG` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-config-write-recursive" + ] + }, + { + "description": "fs:allow-data-meta -> This allows non-recursive read access to metadata of the `$DATA` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-data-meta" + ] + }, + { + "description": "fs:allow-data-meta-recursive -> This allows full recursive read access to metadata of the `$DATA` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-data-meta-recursive" + ] + }, + { + "description": "fs:allow-data-read -> This allows non-recursive read access to the `$DATA` folder.", + "type": "string", + "enum": [ + "fs:allow-data-read" + ] + }, + { + "description": "fs:allow-data-read-recursive -> This allows full recursive read access to the complete `$DATA` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-data-read-recursive" + ] + }, + { + "description": "fs:allow-data-write -> This allows non-recursive write access to the `$DATA` folder.", + "type": "string", + "enum": [ + "fs:allow-data-write" + ] + }, + { + "description": "fs:allow-data-write-recursive -> This allows full recursive write access to the complete `$DATA` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-data-write-recursive" + ] + }, + { + "description": "fs:allow-desktop-meta -> This allows non-recursive read access to metadata of the `$DESKTOP` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-desktop-meta" + ] + }, + { + "description": "fs:allow-desktop-meta-recursive -> This allows full recursive read access to metadata of the `$DESKTOP` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-desktop-meta-recursive" + ] + }, + { + "description": "fs:allow-desktop-read -> This allows non-recursive read access to the `$DESKTOP` folder.", + "type": "string", + "enum": [ + "fs:allow-desktop-read" + ] + }, + { + "description": "fs:allow-desktop-read-recursive -> This allows full recursive read access to the complete `$DESKTOP` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-desktop-read-recursive" + ] + }, + { + "description": "fs:allow-desktop-write -> This allows non-recursive write access to the `$DESKTOP` folder.", + "type": "string", + "enum": [ + "fs:allow-desktop-write" + ] + }, + { + "description": "fs:allow-desktop-write-recursive -> This allows full recursive write access to the complete `$DESKTOP` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-desktop-write-recursive" + ] + }, + { + "description": "fs:allow-document-meta -> This allows non-recursive read access to metadata of the `$DOCUMENT` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-document-meta" + ] + }, + { + "description": "fs:allow-document-meta-recursive -> This allows full recursive read access to metadata of the `$DOCUMENT` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-document-meta-recursive" + ] + }, + { + "description": "fs:allow-document-read -> This allows non-recursive read access to the `$DOCUMENT` folder.", + "type": "string", + "enum": [ + "fs:allow-document-read" + ] + }, + { + "description": "fs:allow-document-read-recursive -> This allows full recursive read access to the complete `$DOCUMENT` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-document-read-recursive" + ] + }, + { + "description": "fs:allow-document-write -> This allows non-recursive write access to the `$DOCUMENT` folder.", + "type": "string", + "enum": [ + "fs:allow-document-write" + ] + }, + { + "description": "fs:allow-document-write-recursive -> This allows full recursive write access to the complete `$DOCUMENT` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-document-write-recursive" + ] + }, + { + "description": "fs:allow-download-meta -> This allows non-recursive read access to metadata of the `$DOWNLOAD` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-download-meta" + ] + }, + { + "description": "fs:allow-download-meta-recursive -> This allows full recursive read access to metadata of the `$DOWNLOAD` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-download-meta-recursive" + ] + }, + { + "description": "fs:allow-download-read -> This allows non-recursive read access to the `$DOWNLOAD` folder.", + "type": "string", + "enum": [ + "fs:allow-download-read" + ] + }, + { + "description": "fs:allow-download-read-recursive -> This allows full recursive read access to the complete `$DOWNLOAD` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-download-read-recursive" + ] + }, + { + "description": "fs:allow-download-write -> This allows non-recursive write access to the `$DOWNLOAD` folder.", + "type": "string", + "enum": [ + "fs:allow-download-write" + ] + }, + { + "description": "fs:allow-download-write-recursive -> This allows full recursive write access to the complete `$DOWNLOAD` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-download-write-recursive" + ] + }, + { + "description": "fs:allow-exe-meta -> This allows non-recursive read access to metadata of the `$EXE` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-exe-meta" + ] + }, + { + "description": "fs:allow-exe-meta-recursive -> This allows full recursive read access to metadata of the `$EXE` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-exe-meta-recursive" + ] + }, + { + "description": "fs:allow-exe-read -> This allows non-recursive read access to the `$EXE` folder.", + "type": "string", + "enum": [ + "fs:allow-exe-read" + ] + }, + { + "description": "fs:allow-exe-read-recursive -> This allows full recursive read access to the complete `$EXE` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-exe-read-recursive" + ] + }, + { + "description": "fs:allow-exe-write -> This allows non-recursive write access to the `$EXE` folder.", + "type": "string", + "enum": [ + "fs:allow-exe-write" + ] + }, + { + "description": "fs:allow-exe-write-recursive -> This allows full recursive write access to the complete `$EXE` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-exe-write-recursive" + ] + }, + { + "description": "fs:allow-font-meta -> This allows non-recursive read access to metadata of the `$FONT` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-font-meta" + ] + }, + { + "description": "fs:allow-font-meta-recursive -> This allows full recursive read access to metadata of the `$FONT` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-font-meta-recursive" + ] + }, + { + "description": "fs:allow-font-read -> This allows non-recursive read access to the `$FONT` folder.", + "type": "string", + "enum": [ + "fs:allow-font-read" + ] + }, + { + "description": "fs:allow-font-read-recursive -> This allows full recursive read access to the complete `$FONT` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-font-read-recursive" + ] + }, + { + "description": "fs:allow-font-write -> This allows non-recursive write access to the `$FONT` folder.", + "type": "string", + "enum": [ + "fs:allow-font-write" + ] + }, + { + "description": "fs:allow-font-write-recursive -> This allows full recursive write access to the complete `$FONT` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-font-write-recursive" + ] + }, + { + "description": "fs:allow-home-meta -> This allows non-recursive read access to metadata of the `$HOME` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-home-meta" + ] + }, + { + "description": "fs:allow-home-meta-recursive -> This allows full recursive read access to metadata of the `$HOME` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-home-meta-recursive" + ] + }, + { + "description": "fs:allow-home-read -> This allows non-recursive read access to the `$HOME` folder.", + "type": "string", + "enum": [ + "fs:allow-home-read" + ] + }, + { + "description": "fs:allow-home-read-recursive -> This allows full recursive read access to the complete `$HOME` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-home-read-recursive" + ] + }, + { + "description": "fs:allow-home-write -> This allows non-recursive write access to the `$HOME` folder.", + "type": "string", + "enum": [ + "fs:allow-home-write" + ] + }, + { + "description": "fs:allow-home-write-recursive -> This allows full recursive write access to the complete `$HOME` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-home-write-recursive" + ] + }, + { + "description": "fs:allow-localdata-meta -> This allows non-recursive read access to metadata of the `$LOCALDATA` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-localdata-meta" + ] + }, + { + "description": "fs:allow-localdata-meta-recursive -> This allows full recursive read access to metadata of the `$LOCALDATA` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-localdata-meta-recursive" + ] + }, + { + "description": "fs:allow-localdata-read -> This allows non-recursive read access to the `$LOCALDATA` folder.", + "type": "string", + "enum": [ + "fs:allow-localdata-read" + ] + }, + { + "description": "fs:allow-localdata-read-recursive -> This allows full recursive read access to the complete `$LOCALDATA` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-localdata-read-recursive" + ] + }, + { + "description": "fs:allow-localdata-write -> This allows non-recursive write access to the `$LOCALDATA` folder.", + "type": "string", + "enum": [ + "fs:allow-localdata-write" + ] + }, + { + "description": "fs:allow-localdata-write-recursive -> This allows full recursive write access to the complete `$LOCALDATA` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-localdata-write-recursive" + ] + }, + { + "description": "fs:allow-log-meta -> This allows non-recursive read access to metadata of the `$LOG` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-log-meta" + ] + }, + { + "description": "fs:allow-log-meta-recursive -> This allows full recursive read access to metadata of the `$LOG` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-log-meta-recursive" + ] + }, + { + "description": "fs:allow-log-read -> This allows non-recursive read access to the `$LOG` folder.", + "type": "string", + "enum": [ + "fs:allow-log-read" + ] + }, + { + "description": "fs:allow-log-read-recursive -> This allows full recursive read access to the complete `$LOG` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-log-read-recursive" + ] + }, + { + "description": "fs:allow-log-write -> This allows non-recursive write access to the `$LOG` folder.", + "type": "string", + "enum": [ + "fs:allow-log-write" + ] + }, + { + "description": "fs:allow-log-write-recursive -> This allows full recursive write access to the complete `$LOG` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-log-write-recursive" + ] + }, + { + "description": "fs:allow-picture-meta -> This allows non-recursive read access to metadata of the `$PICTURE` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-picture-meta" + ] + }, + { + "description": "fs:allow-picture-meta-recursive -> This allows full recursive read access to metadata of the `$PICTURE` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-picture-meta-recursive" + ] + }, + { + "description": "fs:allow-picture-read -> This allows non-recursive read access to the `$PICTURE` folder.", + "type": "string", + "enum": [ + "fs:allow-picture-read" + ] + }, + { + "description": "fs:allow-picture-read-recursive -> This allows full recursive read access to the complete `$PICTURE` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-picture-read-recursive" + ] + }, + { + "description": "fs:allow-picture-write -> This allows non-recursive write access to the `$PICTURE` folder.", + "type": "string", + "enum": [ + "fs:allow-picture-write" + ] + }, + { + "description": "fs:allow-picture-write-recursive -> This allows full recursive write access to the complete `$PICTURE` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-picture-write-recursive" + ] + }, + { + "description": "fs:allow-public-meta -> This allows non-recursive read access to metadata of the `$PUBLIC` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-public-meta" + ] + }, + { + "description": "fs:allow-public-meta-recursive -> This allows full recursive read access to metadata of the `$PUBLIC` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-public-meta-recursive" + ] + }, + { + "description": "fs:allow-public-read -> This allows non-recursive read access to the `$PUBLIC` folder.", + "type": "string", + "enum": [ + "fs:allow-public-read" + ] + }, + { + "description": "fs:allow-public-read-recursive -> This allows full recursive read access to the complete `$PUBLIC` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-public-read-recursive" + ] + }, + { + "description": "fs:allow-public-write -> This allows non-recursive write access to the `$PUBLIC` folder.", + "type": "string", + "enum": [ + "fs:allow-public-write" + ] + }, + { + "description": "fs:allow-public-write-recursive -> This allows full recursive write access to the complete `$PUBLIC` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-public-write-recursive" + ] + }, + { + "description": "fs:allow-resource-meta -> This allows non-recursive read access to metadata of the `$RESOURCE` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-resource-meta" + ] + }, + { + "description": "fs:allow-resource-meta-recursive -> This allows full recursive read access to metadata of the `$RESOURCE` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-resource-meta-recursive" + ] + }, + { + "description": "fs:allow-resource-read -> This allows non-recursive read access to the `$RESOURCE` folder.", + "type": "string", + "enum": [ + "fs:allow-resource-read" + ] + }, + { + "description": "fs:allow-resource-read-recursive -> This allows full recursive read access to the complete `$RESOURCE` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-resource-read-recursive" + ] + }, + { + "description": "fs:allow-resource-write -> This allows non-recursive write access to the `$RESOURCE` folder.", + "type": "string", + "enum": [ + "fs:allow-resource-write" + ] + }, + { + "description": "fs:allow-resource-write-recursive -> This allows full recursive write access to the complete `$RESOURCE` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-resource-write-recursive" + ] + }, + { + "description": "fs:allow-runtime-meta -> This allows non-recursive read access to metadata of the `$RUNTIME` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-runtime-meta" + ] + }, + { + "description": "fs:allow-runtime-meta-recursive -> This allows full recursive read access to metadata of the `$RUNTIME` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-runtime-meta-recursive" + ] + }, + { + "description": "fs:allow-runtime-read -> This allows non-recursive read access to the `$RUNTIME` folder.", + "type": "string", + "enum": [ + "fs:allow-runtime-read" + ] + }, + { + "description": "fs:allow-runtime-read-recursive -> This allows full recursive read access to the complete `$RUNTIME` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-runtime-read-recursive" + ] + }, + { + "description": "fs:allow-runtime-write -> This allows non-recursive write access to the `$RUNTIME` folder.", + "type": "string", + "enum": [ + "fs:allow-runtime-write" + ] + }, + { + "description": "fs:allow-runtime-write-recursive -> This allows full recursive write access to the complete `$RUNTIME` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-runtime-write-recursive" + ] + }, + { + "description": "fs:allow-temp-meta -> This allows non-recursive read access to metadata of the `$TEMP` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-temp-meta" + ] + }, + { + "description": "fs:allow-temp-meta-recursive -> This allows full recursive read access to metadata of the `$TEMP` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-temp-meta-recursive" + ] + }, + { + "description": "fs:allow-temp-read -> This allows non-recursive read access to the `$TEMP` folder.", + "type": "string", + "enum": [ + "fs:allow-temp-read" + ] + }, + { + "description": "fs:allow-temp-read-recursive -> This allows full recursive read access to the complete `$TEMP` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-temp-read-recursive" + ] + }, + { + "description": "fs:allow-temp-write -> This allows non-recursive write access to the `$TEMP` folder.", + "type": "string", + "enum": [ + "fs:allow-temp-write" + ] + }, + { + "description": "fs:allow-temp-write-recursive -> This allows full recursive write access to the complete `$TEMP` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-temp-write-recursive" + ] + }, + { + "description": "fs:allow-template-meta -> This allows non-recursive read access to metadata of the `$TEMPLATE` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-template-meta" + ] + }, + { + "description": "fs:allow-template-meta-recursive -> This allows full recursive read access to metadata of the `$TEMPLATE` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-template-meta-recursive" + ] + }, + { + "description": "fs:allow-template-read -> This allows non-recursive read access to the `$TEMPLATE` folder.", + "type": "string", + "enum": [ + "fs:allow-template-read" + ] + }, + { + "description": "fs:allow-template-read-recursive -> This allows full recursive read access to the complete `$TEMPLATE` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-template-read-recursive" + ] + }, + { + "description": "fs:allow-template-write -> This allows non-recursive write access to the `$TEMPLATE` folder.", + "type": "string", + "enum": [ + "fs:allow-template-write" + ] + }, + { + "description": "fs:allow-template-write-recursive -> This allows full recursive write access to the complete `$TEMPLATE` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-template-write-recursive" + ] + }, + { + "description": "fs:allow-video-meta -> This allows non-recursive read access to metadata of the `$VIDEO` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-video-meta" + ] + }, + { + "description": "fs:allow-video-meta-recursive -> This allows full recursive read access to metadata of the `$VIDEO` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-video-meta-recursive" + ] + }, + { + "description": "fs:allow-video-read -> This allows non-recursive read access to the `$VIDEO` folder.", + "type": "string", + "enum": [ + "fs:allow-video-read" + ] + }, + { + "description": "fs:allow-video-read-recursive -> This allows full recursive read access to the complete `$VIDEO` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-video-read-recursive" + ] + }, + { + "description": "fs:allow-video-write -> This allows non-recursive write access to the `$VIDEO` folder.", + "type": "string", + "enum": [ + "fs:allow-video-write" + ] + }, + { + "description": "fs:allow-video-write-recursive -> This allows full recursive write access to the complete `$VIDEO` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-video-write-recursive" + ] + }, + { + "description": "fs:deny-default -> This denies access to dangerous Tauri relevant files and folders by default.", + "type": "string", + "enum": [ + "fs:deny-default" + ] + }, + { + "description": "fs:default -> This set of permissions describes the what kind of\nfile system access the `fs` plugin has enabled or denied by default.\n\n#### Granted Permissions\n\nThis default permission set enables read access to the\napplication specific directories (AppConfig, AppData, AppLocalData, AppCache,\nAppLog) and all files and sub directories created in it.\nThe location of these directories depends on the operating system,\nwhere the application is run.\n\nIn general these directories need to be manually created\nby the application at runtime, before accessing files or folders\nin it is possible.\n\nTherefore, it is also allowed to create all of these folders via\nthe `mkdir` command.\n\n#### Denied Permissions\n\nThis default permission set prevents access to critical components\nof the Tauri application by default.\nOn Windows the webview data folder access is denied.\n\n", + "type": "string", + "enum": [ + "fs:default" + ] + }, + { + "description": "fs:allow-copy-file -> Enables the copy_file command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:allow-copy-file" + ] + }, + { + "description": "fs:allow-create -> Enables the create command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:allow-create" + ] + }, + { + "description": "fs:allow-exists -> Enables the exists command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:allow-exists" + ] + }, + { + "description": "fs:allow-fstat -> Enables the fstat command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:allow-fstat" + ] + }, + { + "description": "fs:allow-ftruncate -> Enables the ftruncate command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:allow-ftruncate" + ] + }, + { + "description": "fs:allow-lstat -> Enables the lstat command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:allow-lstat" + ] + }, + { + "description": "fs:allow-mkdir -> Enables the mkdir command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:allow-mkdir" + ] + }, + { + "description": "fs:allow-open -> Enables the open command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:allow-open" + ] + }, + { + "description": "fs:allow-read -> Enables the read command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:allow-read" + ] + }, + { + "description": "fs:allow-read-dir -> Enables the read_dir command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:allow-read-dir" + ] + }, + { + "description": "fs:allow-read-file -> Enables the read_file command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:allow-read-file" + ] + }, + { + "description": "fs:allow-read-text-file -> Enables the read_text_file command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:allow-read-text-file" + ] + }, + { + "description": "fs:allow-read-text-file-lines -> Enables the read_text_file_lines command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:allow-read-text-file-lines" + ] + }, + { + "description": "fs:allow-read-text-file-lines-next -> Enables the read_text_file_lines_next command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:allow-read-text-file-lines-next" + ] + }, + { + "description": "fs:allow-remove -> Enables the remove command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:allow-remove" + ] + }, + { + "description": "fs:allow-rename -> Enables the rename command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:allow-rename" + ] + }, + { + "description": "fs:allow-seek -> Enables the seek command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:allow-seek" + ] + }, + { + "description": "fs:allow-stat -> Enables the stat command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:allow-stat" + ] + }, + { + "description": "fs:allow-truncate -> Enables the truncate command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:allow-truncate" + ] + }, + { + "description": "fs:allow-unwatch -> Enables the unwatch command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:allow-unwatch" + ] + }, + { + "description": "fs:allow-watch -> Enables the watch command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:allow-watch" + ] + }, + { + "description": "fs:allow-write -> Enables the write command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:allow-write" + ] + }, + { + "description": "fs:allow-write-file -> Enables the write_file command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:allow-write-file" + ] + }, + { + "description": "fs:allow-write-text-file -> Enables the write_text_file command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:allow-write-text-file" + ] + }, + { + "description": "fs:create-app-specific-dirs -> This permissions allows to create the application specific directories.\n", + "type": "string", + "enum": [ + "fs:create-app-specific-dirs" + ] + }, + { + "description": "fs:deny-copy-file -> Denies the copy_file command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:deny-copy-file" + ] + }, + { + "description": "fs:deny-create -> Denies the create command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:deny-create" + ] + }, + { + "description": "fs:deny-exists -> Denies the exists command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:deny-exists" + ] + }, + { + "description": "fs:deny-fstat -> Denies the fstat command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:deny-fstat" + ] + }, + { + "description": "fs:deny-ftruncate -> Denies the ftruncate command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:deny-ftruncate" + ] + }, + { + "description": "fs:deny-lstat -> Denies the lstat command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:deny-lstat" + ] + }, + { + "description": "fs:deny-mkdir -> Denies the mkdir command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:deny-mkdir" + ] + }, + { + "description": "fs:deny-open -> Denies the open command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:deny-open" + ] + }, + { + "description": "fs:deny-read -> Denies the read command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:deny-read" + ] + }, + { + "description": "fs:deny-read-dir -> Denies the read_dir command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:deny-read-dir" + ] + }, + { + "description": "fs:deny-read-file -> Denies the read_file command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:deny-read-file" + ] + }, + { + "description": "fs:deny-read-text-file -> Denies the read_text_file command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:deny-read-text-file" + ] + }, + { + "description": "fs:deny-read-text-file-lines -> Denies the read_text_file_lines command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:deny-read-text-file-lines" + ] + }, + { + "description": "fs:deny-read-text-file-lines-next -> Denies the read_text_file_lines_next command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:deny-read-text-file-lines-next" + ] + }, + { + "description": "fs:deny-remove -> Denies the remove command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:deny-remove" + ] + }, + { + "description": "fs:deny-rename -> Denies the rename command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:deny-rename" + ] + }, + { + "description": "fs:deny-seek -> Denies the seek command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:deny-seek" + ] + }, + { + "description": "fs:deny-stat -> Denies the stat command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:deny-stat" + ] + }, + { + "description": "fs:deny-truncate -> Denies the truncate command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:deny-truncate" + ] + }, + { + "description": "fs:deny-unwatch -> Denies the unwatch command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:deny-unwatch" + ] + }, + { + "description": "fs:deny-watch -> Denies the watch command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:deny-watch" + ] + }, + { + "description": "fs:deny-webview-data-linux -> This denies read access to the\n`$APPLOCALDATA` folder on linux as the webview data and configuration values are stored here.\nAllowing access can lead to sensitive information disclosure and should be well considered.", + "type": "string", + "enum": [ + "fs:deny-webview-data-linux" + ] + }, + { + "description": "fs:deny-webview-data-windows -> This denies read access to the\n`$APPLOCALDATA/EBWebView` folder on windows as the webview data and configuration values are stored here.\nAllowing access can lead to sensitive information disclosure and should be well considered.", + "type": "string", + "enum": [ + "fs:deny-webview-data-windows" + ] + }, + { + "description": "fs:deny-write -> Denies the write command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:deny-write" + ] + }, + { + "description": "fs:deny-write-file -> Denies the write_file command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:deny-write-file" + ] + }, + { + "description": "fs:deny-write-text-file -> Denies the write_text_file command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:deny-write-text-file" + ] + }, + { + "description": "fs:read-all -> This enables all read related commands without any pre-configured accessible paths.", + "type": "string", + "enum": [ + "fs:read-all" + ] + }, + { + "description": "fs:read-app-specific-dirs-recursive -> This permission allows recursive read functionality on the application\nspecific base directories. \n", + "type": "string", + "enum": [ + "fs:read-app-specific-dirs-recursive" + ] + }, + { + "description": "fs:read-dirs -> This enables directory read and file metadata related commands without any pre-configured accessible paths.", + "type": "string", + "enum": [ + "fs:read-dirs" + ] + }, + { + "description": "fs:read-files -> This enables file read related commands without any pre-configured accessible paths.", + "type": "string", + "enum": [ + "fs:read-files" + ] + }, + { + "description": "fs:read-meta -> This enables all index or metadata related commands without any pre-configured accessible paths.", + "type": "string", + "enum": [ + "fs:read-meta" + ] + }, + { + "description": "fs:scope -> An empty permission you can use to modify the global scope.", + "type": "string", + "enum": [ + "fs:scope" + ] + }, + { + "description": "fs:scope-app -> This scope permits access to all files and list content of top level directories in the `$APP`folder.", + "type": "string", + "enum": [ + "fs:scope-app" + ] + }, + { + "description": "fs:scope-app-index -> This scope permits to list all files and folders in the `$APP`folder.", + "type": "string", + "enum": [ + "fs:scope-app-index" + ] + }, + { + "description": "fs:scope-app-recursive -> This scope permits recursive access to the complete `$APP` folder, including sub directories and files.", + "type": "string", + "enum": [ + "fs:scope-app-recursive" + ] + }, + { + "description": "fs:scope-appcache -> This scope permits access to all files and list content of top level directories in the `$APPCACHE`folder.", + "type": "string", + "enum": [ + "fs:scope-appcache" + ] + }, + { + "description": "fs:scope-appcache-index -> This scope permits to list all files and folders in the `$APPCACHE`folder.", + "type": "string", + "enum": [ + "fs:scope-appcache-index" + ] + }, + { + "description": "fs:scope-appcache-recursive -> This scope permits recursive access to the complete `$APPCACHE` folder, including sub directories and files.", + "type": "string", + "enum": [ + "fs:scope-appcache-recursive" + ] + }, + { + "description": "fs:scope-appconfig -> This scope permits access to all files and list content of top level directories in the `$APPCONFIG`folder.", + "type": "string", + "enum": [ + "fs:scope-appconfig" + ] + }, + { + "description": "fs:scope-appconfig-index -> This scope permits to list all files and folders in the `$APPCONFIG`folder.", + "type": "string", + "enum": [ + "fs:scope-appconfig-index" + ] + }, + { + "description": "fs:scope-appconfig-recursive -> This scope permits recursive access to the complete `$APPCONFIG` folder, including sub directories and files.", + "type": "string", + "enum": [ + "fs:scope-appconfig-recursive" + ] + }, + { + "description": "fs:scope-appdata -> This scope permits access to all files and list content of top level directories in the `$APPDATA`folder.", + "type": "string", + "enum": [ + "fs:scope-appdata" + ] + }, + { + "description": "fs:scope-appdata-index -> This scope permits to list all files and folders in the `$APPDATA`folder.", + "type": "string", + "enum": [ + "fs:scope-appdata-index" + ] + }, + { + "description": "fs:scope-appdata-recursive -> This scope permits recursive access to the complete `$APPDATA` folder, including sub directories and files.", + "type": "string", + "enum": [ + "fs:scope-appdata-recursive" + ] + }, + { + "description": "fs:scope-applocaldata -> This scope permits access to all files and list content of top level directories in the `$APPLOCALDATA`folder.", + "type": "string", + "enum": [ + "fs:scope-applocaldata" + ] + }, + { + "description": "fs:scope-applocaldata-index -> This scope permits to list all files and folders in the `$APPLOCALDATA`folder.", + "type": "string", + "enum": [ + "fs:scope-applocaldata-index" + ] + }, + { + "description": "fs:scope-applocaldata-recursive -> This scope permits recursive access to the complete `$APPLOCALDATA` folder, including sub directories and files.", + "type": "string", + "enum": [ + "fs:scope-applocaldata-recursive" + ] + }, + { + "description": "fs:scope-applog -> This scope permits access to all files and list content of top level directories in the `$APPLOG`folder.", + "type": "string", + "enum": [ + "fs:scope-applog" + ] + }, + { + "description": "fs:scope-applog-index -> This scope permits to list all files and folders in the `$APPLOG`folder.", + "type": "string", + "enum": [ + "fs:scope-applog-index" + ] + }, + { + "description": "fs:scope-applog-recursive -> This scope permits recursive access to the complete `$APPLOG` folder, including sub directories and files.", + "type": "string", + "enum": [ + "fs:scope-applog-recursive" + ] + }, + { + "description": "fs:scope-audio -> This scope permits access to all files and list content of top level directories in the `$AUDIO`folder.", + "type": "string", + "enum": [ + "fs:scope-audio" + ] + }, + { + "description": "fs:scope-audio-index -> This scope permits to list all files and folders in the `$AUDIO`folder.", + "type": "string", + "enum": [ + "fs:scope-audio-index" + ] + }, + { + "description": "fs:scope-audio-recursive -> This scope permits recursive access to the complete `$AUDIO` folder, including sub directories and files.", + "type": "string", + "enum": [ + "fs:scope-audio-recursive" + ] + }, + { + "description": "fs:scope-cache -> This scope permits access to all files and list content of top level directories in the `$CACHE`folder.", + "type": "string", + "enum": [ + "fs:scope-cache" + ] + }, + { + "description": "fs:scope-cache-index -> This scope permits to list all files and folders in the `$CACHE`folder.", + "type": "string", + "enum": [ + "fs:scope-cache-index" + ] + }, + { + "description": "fs:scope-cache-recursive -> This scope permits recursive access to the complete `$CACHE` folder, including sub directories and files.", + "type": "string", + "enum": [ + "fs:scope-cache-recursive" + ] + }, + { + "description": "fs:scope-config -> This scope permits access to all files and list content of top level directories in the `$CONFIG`folder.", + "type": "string", + "enum": [ + "fs:scope-config" + ] + }, + { + "description": "fs:scope-config-index -> This scope permits to list all files and folders in the `$CONFIG`folder.", + "type": "string", + "enum": [ + "fs:scope-config-index" + ] + }, + { + "description": "fs:scope-config-recursive -> This scope permits recursive access to the complete `$CONFIG` folder, including sub directories and files.", + "type": "string", + "enum": [ + "fs:scope-config-recursive" + ] + }, + { + "description": "fs:scope-data -> This scope permits access to all files and list content of top level directories in the `$DATA`folder.", + "type": "string", + "enum": [ + "fs:scope-data" + ] + }, + { + "description": "fs:scope-data-index -> This scope permits to list all files and folders in the `$DATA`folder.", + "type": "string", + "enum": [ + "fs:scope-data-index" + ] + }, + { + "description": "fs:scope-data-recursive -> This scope permits recursive access to the complete `$DATA` folder, including sub directories and files.", + "type": "string", + "enum": [ + "fs:scope-data-recursive" + ] + }, + { + "description": "fs:scope-desktop -> This scope permits access to all files and list content of top level directories in the `$DESKTOP`folder.", + "type": "string", + "enum": [ + "fs:scope-desktop" + ] + }, + { + "description": "fs:scope-desktop-index -> This scope permits to list all files and folders in the `$DESKTOP`folder.", + "type": "string", + "enum": [ + "fs:scope-desktop-index" + ] + }, + { + "description": "fs:scope-desktop-recursive -> This scope permits recursive access to the complete `$DESKTOP` folder, including sub directories and files.", + "type": "string", + "enum": [ + "fs:scope-desktop-recursive" + ] + }, + { + "description": "fs:scope-document -> This scope permits access to all files and list content of top level directories in the `$DOCUMENT`folder.", + "type": "string", + "enum": [ + "fs:scope-document" + ] + }, + { + "description": "fs:scope-document-index -> This scope permits to list all files and folders in the `$DOCUMENT`folder.", + "type": "string", + "enum": [ + "fs:scope-document-index" + ] + }, + { + "description": "fs:scope-document-recursive -> This scope permits recursive access to the complete `$DOCUMENT` folder, including sub directories and files.", + "type": "string", + "enum": [ + "fs:scope-document-recursive" + ] + }, + { + "description": "fs:scope-download -> This scope permits access to all files and list content of top level directories in the `$DOWNLOAD`folder.", + "type": "string", + "enum": [ + "fs:scope-download" + ] + }, + { + "description": "fs:scope-download-index -> This scope permits to list all files and folders in the `$DOWNLOAD`folder.", + "type": "string", + "enum": [ + "fs:scope-download-index" + ] + }, + { + "description": "fs:scope-download-recursive -> This scope permits recursive access to the complete `$DOWNLOAD` folder, including sub directories and files.", + "type": "string", + "enum": [ + "fs:scope-download-recursive" + ] + }, + { + "description": "fs:scope-exe -> This scope permits access to all files and list content of top level directories in the `$EXE`folder.", + "type": "string", + "enum": [ + "fs:scope-exe" + ] + }, + { + "description": "fs:scope-exe-index -> This scope permits to list all files and folders in the `$EXE`folder.", + "type": "string", + "enum": [ + "fs:scope-exe-index" + ] + }, + { + "description": "fs:scope-exe-recursive -> This scope permits recursive access to the complete `$EXE` folder, including sub directories and files.", + "type": "string", + "enum": [ + "fs:scope-exe-recursive" + ] + }, + { + "description": "fs:scope-font -> This scope permits access to all files and list content of top level directories in the `$FONT`folder.", + "type": "string", + "enum": [ + "fs:scope-font" + ] + }, + { + "description": "fs:scope-font-index -> This scope permits to list all files and folders in the `$FONT`folder.", + "type": "string", + "enum": [ + "fs:scope-font-index" + ] + }, + { + "description": "fs:scope-font-recursive -> This scope permits recursive access to the complete `$FONT` folder, including sub directories and files.", + "type": "string", + "enum": [ + "fs:scope-font-recursive" + ] + }, + { + "description": "fs:scope-home -> This scope permits access to all files and list content of top level directories in the `$HOME`folder.", + "type": "string", + "enum": [ + "fs:scope-home" + ] + }, + { + "description": "fs:scope-home-index -> This scope permits to list all files and folders in the `$HOME`folder.", + "type": "string", + "enum": [ + "fs:scope-home-index" + ] + }, + { + "description": "fs:scope-home-recursive -> This scope permits recursive access to the complete `$HOME` folder, including sub directories and files.", + "type": "string", + "enum": [ + "fs:scope-home-recursive" + ] + }, + { + "description": "fs:scope-localdata -> This scope permits access to all files and list content of top level directories in the `$LOCALDATA`folder.", + "type": "string", + "enum": [ + "fs:scope-localdata" + ] + }, + { + "description": "fs:scope-localdata-index -> This scope permits to list all files and folders in the `$LOCALDATA`folder.", + "type": "string", + "enum": [ + "fs:scope-localdata-index" + ] + }, + { + "description": "fs:scope-localdata-recursive -> This scope permits recursive access to the complete `$LOCALDATA` folder, including sub directories and files.", + "type": "string", + "enum": [ + "fs:scope-localdata-recursive" + ] + }, + { + "description": "fs:scope-log -> This scope permits access to all files and list content of top level directories in the `$LOG`folder.", + "type": "string", + "enum": [ + "fs:scope-log" + ] + }, + { + "description": "fs:scope-log-index -> This scope permits to list all files and folders in the `$LOG`folder.", + "type": "string", + "enum": [ + "fs:scope-log-index" + ] + }, + { + "description": "fs:scope-log-recursive -> This scope permits recursive access to the complete `$LOG` folder, including sub directories and files.", + "type": "string", + "enum": [ + "fs:scope-log-recursive" + ] + }, + { + "description": "fs:scope-picture -> This scope permits access to all files and list content of top level directories in the `$PICTURE`folder.", + "type": "string", + "enum": [ + "fs:scope-picture" + ] + }, + { + "description": "fs:scope-picture-index -> This scope permits to list all files and folders in the `$PICTURE`folder.", + "type": "string", + "enum": [ + "fs:scope-picture-index" + ] + }, + { + "description": "fs:scope-picture-recursive -> This scope permits recursive access to the complete `$PICTURE` folder, including sub directories and files.", + "type": "string", + "enum": [ + "fs:scope-picture-recursive" + ] + }, + { + "description": "fs:scope-public -> This scope permits access to all files and list content of top level directories in the `$PUBLIC`folder.", + "type": "string", + "enum": [ + "fs:scope-public" + ] + }, + { + "description": "fs:scope-public-index -> This scope permits to list all files and folders in the `$PUBLIC`folder.", + "type": "string", + "enum": [ + "fs:scope-public-index" + ] + }, + { + "description": "fs:scope-public-recursive -> This scope permits recursive access to the complete `$PUBLIC` folder, including sub directories and files.", + "type": "string", + "enum": [ + "fs:scope-public-recursive" + ] + }, + { + "description": "fs:scope-resource -> This scope permits access to all files and list content of top level directories in the `$RESOURCE`folder.", + "type": "string", + "enum": [ + "fs:scope-resource" + ] + }, + { + "description": "fs:scope-resource-index -> This scope permits to list all files and folders in the `$RESOURCE`folder.", + "type": "string", + "enum": [ + "fs:scope-resource-index" + ] + }, + { + "description": "fs:scope-resource-recursive -> This scope permits recursive access to the complete `$RESOURCE` folder, including sub directories and files.", + "type": "string", + "enum": [ + "fs:scope-resource-recursive" + ] + }, + { + "description": "fs:scope-runtime -> This scope permits access to all files and list content of top level directories in the `$RUNTIME`folder.", + "type": "string", + "enum": [ + "fs:scope-runtime" + ] + }, + { + "description": "fs:scope-runtime-index -> This scope permits to list all files and folders in the `$RUNTIME`folder.", + "type": "string", + "enum": [ + "fs:scope-runtime-index" + ] + }, + { + "description": "fs:scope-runtime-recursive -> This scope permits recursive access to the complete `$RUNTIME` folder, including sub directories and files.", + "type": "string", + "enum": [ + "fs:scope-runtime-recursive" + ] + }, + { + "description": "fs:scope-temp -> This scope permits access to all files and list content of top level directories in the `$TEMP`folder.", + "type": "string", + "enum": [ + "fs:scope-temp" + ] + }, + { + "description": "fs:scope-temp-index -> This scope permits to list all files and folders in the `$TEMP`folder.", + "type": "string", + "enum": [ + "fs:scope-temp-index" + ] + }, + { + "description": "fs:scope-temp-recursive -> This scope permits recursive access to the complete `$TEMP` folder, including sub directories and files.", + "type": "string", + "enum": [ + "fs:scope-temp-recursive" + ] + }, + { + "description": "fs:scope-template -> This scope permits access to all files and list content of top level directories in the `$TEMPLATE`folder.", + "type": "string", + "enum": [ + "fs:scope-template" + ] + }, + { + "description": "fs:scope-template-index -> This scope permits to list all files and folders in the `$TEMPLATE`folder.", + "type": "string", + "enum": [ + "fs:scope-template-index" + ] + }, + { + "description": "fs:scope-template-recursive -> This scope permits recursive access to the complete `$TEMPLATE` folder, including sub directories and files.", + "type": "string", + "enum": [ + "fs:scope-template-recursive" + ] + }, + { + "description": "fs:scope-video -> This scope permits access to all files and list content of top level directories in the `$VIDEO`folder.", + "type": "string", + "enum": [ + "fs:scope-video" + ] + }, + { + "description": "fs:scope-video-index -> This scope permits to list all files and folders in the `$VIDEO`folder.", + "type": "string", + "enum": [ + "fs:scope-video-index" + ] + }, + { + "description": "fs:scope-video-recursive -> This scope permits recursive access to the complete `$VIDEO` folder, including sub directories and files.", + "type": "string", + "enum": [ + "fs:scope-video-recursive" + ] + }, + { + "description": "fs:write-all -> This enables all write related commands without any pre-configured accessible paths.", + "type": "string", + "enum": [ + "fs:write-all" + ] + }, + { + "description": "fs:write-files -> This enables all file write related commands without any pre-configured accessible paths.", + "type": "string", + "enum": [ + "fs:write-files" + ] + }, + { + "description": "global-shortcut:default -> No features are enabled by default, as we believe\nthe shortcuts can be inherently dangerous and it is\napplication specific if specific shortcuts should be\nregistered or unregistered.\n", + "type": "string", + "enum": [ + "global-shortcut:default" + ] + }, + { + "description": "global-shortcut:allow-is-registered -> Enables the is_registered command without any pre-configured scope.", + "type": "string", + "enum": [ + "global-shortcut:allow-is-registered" + ] + }, + { + "description": "global-shortcut:allow-register -> Enables the register command without any pre-configured scope.", + "type": "string", + "enum": [ + "global-shortcut:allow-register" + ] + }, + { + "description": "global-shortcut:allow-register-all -> Enables the register_all command without any pre-configured scope.", + "type": "string", + "enum": [ + "global-shortcut:allow-register-all" + ] + }, + { + "description": "global-shortcut:allow-unregister -> Enables the unregister command without any pre-configured scope.", + "type": "string", + "enum": [ + "global-shortcut:allow-unregister" + ] + }, + { + "description": "global-shortcut:allow-unregister-all -> Enables the unregister_all command without any pre-configured scope.", + "type": "string", + "enum": [ + "global-shortcut:allow-unregister-all" + ] + }, + { + "description": "global-shortcut:deny-is-registered -> Denies the is_registered command without any pre-configured scope.", + "type": "string", + "enum": [ + "global-shortcut:deny-is-registered" + ] + }, + { + "description": "global-shortcut:deny-register -> Denies the register command without any pre-configured scope.", + "type": "string", + "enum": [ + "global-shortcut:deny-register" + ] + }, + { + "description": "global-shortcut:deny-register-all -> Denies the register_all command without any pre-configured scope.", + "type": "string", + "enum": [ + "global-shortcut:deny-register-all" + ] + }, + { + "description": "global-shortcut:deny-unregister -> Denies the unregister command without any pre-configured scope.", + "type": "string", + "enum": [ + "global-shortcut:deny-unregister" + ] + }, + { + "description": "global-shortcut:deny-unregister-all -> Denies the unregister_all command without any pre-configured scope.", + "type": "string", + "enum": [ + "global-shortcut:deny-unregister-all" + ] + }, + { + "description": "notification:default -> This permission set configures which\nnotification features are by default exposed.\n\n#### Granted Permissions\n\nIt allows all notification related features.\n\n", + "type": "string", + "enum": [ + "notification:default" + ] + }, + { + "description": "notification:allow-batch -> Enables the batch command without any pre-configured scope.", + "type": "string", + "enum": [ + "notification:allow-batch" + ] + }, + { + "description": "notification:allow-cancel -> Enables the cancel command without any pre-configured scope.", + "type": "string", + "enum": [ + "notification:allow-cancel" + ] + }, + { + "description": "notification:allow-check-permissions -> Enables the check_permissions command without any pre-configured scope.", + "type": "string", + "enum": [ + "notification:allow-check-permissions" + ] + }, + { + "description": "notification:allow-create-channel -> Enables the create_channel command without any pre-configured scope.", + "type": "string", + "enum": [ + "notification:allow-create-channel" + ] + }, + { + "description": "notification:allow-delete-channel -> Enables the delete_channel command without any pre-configured scope.", + "type": "string", + "enum": [ + "notification:allow-delete-channel" + ] + }, + { + "description": "notification:allow-get-active -> Enables the get_active command without any pre-configured scope.", + "type": "string", + "enum": [ + "notification:allow-get-active" + ] + }, + { + "description": "notification:allow-get-pending -> Enables the get_pending command without any pre-configured scope.", + "type": "string", + "enum": [ + "notification:allow-get-pending" + ] + }, + { + "description": "notification:allow-is-permission-granted -> Enables the is_permission_granted command without any pre-configured scope.", + "type": "string", + "enum": [ + "notification:allow-is-permission-granted" + ] + }, + { + "description": "notification:allow-list-channels -> Enables the list_channels command without any pre-configured scope.", + "type": "string", + "enum": [ + "notification:allow-list-channels" + ] + }, + { + "description": "notification:allow-notify -> Enables the notify command without any pre-configured scope.", + "type": "string", + "enum": [ + "notification:allow-notify" + ] + }, + { + "description": "notification:allow-permission-state -> Enables the permission_state command without any pre-configured scope.", + "type": "string", + "enum": [ + "notification:allow-permission-state" + ] + }, + { + "description": "notification:allow-register-action-types -> Enables the register_action_types command without any pre-configured scope.", + "type": "string", + "enum": [ + "notification:allow-register-action-types" + ] + }, + { + "description": "notification:allow-register-listener -> Enables the register_listener command without any pre-configured scope.", + "type": "string", + "enum": [ + "notification:allow-register-listener" + ] + }, + { + "description": "notification:allow-remove-active -> Enables the remove_active command without any pre-configured scope.", + "type": "string", + "enum": [ + "notification:allow-remove-active" + ] + }, + { + "description": "notification:allow-request-permission -> Enables the request_permission command without any pre-configured scope.", + "type": "string", + "enum": [ + "notification:allow-request-permission" + ] + }, + { + "description": "notification:allow-show -> Enables the show command without any pre-configured scope.", + "type": "string", + "enum": [ + "notification:allow-show" + ] + }, + { + "description": "notification:deny-batch -> Denies the batch command without any pre-configured scope.", + "type": "string", + "enum": [ + "notification:deny-batch" + ] + }, + { + "description": "notification:deny-cancel -> Denies the cancel command without any pre-configured scope.", + "type": "string", + "enum": [ + "notification:deny-cancel" + ] + }, + { + "description": "notification:deny-check-permissions -> Denies the check_permissions command without any pre-configured scope.", + "type": "string", + "enum": [ + "notification:deny-check-permissions" + ] + }, + { + "description": "notification:deny-create-channel -> Denies the create_channel command without any pre-configured scope.", + "type": "string", + "enum": [ + "notification:deny-create-channel" + ] + }, + { + "description": "notification:deny-delete-channel -> Denies the delete_channel command without any pre-configured scope.", + "type": "string", + "enum": [ + "notification:deny-delete-channel" + ] + }, + { + "description": "notification:deny-get-active -> Denies the get_active command without any pre-configured scope.", + "type": "string", + "enum": [ + "notification:deny-get-active" + ] + }, + { + "description": "notification:deny-get-pending -> Denies the get_pending command without any pre-configured scope.", + "type": "string", + "enum": [ + "notification:deny-get-pending" + ] + }, + { + "description": "notification:deny-is-permission-granted -> Denies the is_permission_granted command without any pre-configured scope.", + "type": "string", + "enum": [ + "notification:deny-is-permission-granted" + ] + }, + { + "description": "notification:deny-list-channels -> Denies the list_channels command without any pre-configured scope.", + "type": "string", + "enum": [ + "notification:deny-list-channels" + ] + }, + { + "description": "notification:deny-notify -> Denies the notify command without any pre-configured scope.", + "type": "string", + "enum": [ + "notification:deny-notify" + ] + }, + { + "description": "notification:deny-permission-state -> Denies the permission_state command without any pre-configured scope.", + "type": "string", + "enum": [ + "notification:deny-permission-state" + ] + }, + { + "description": "notification:deny-register-action-types -> Denies the register_action_types command without any pre-configured scope.", + "type": "string", + "enum": [ + "notification:deny-register-action-types" + ] + }, + { + "description": "notification:deny-register-listener -> Denies the register_listener command without any pre-configured scope.", + "type": "string", + "enum": [ + "notification:deny-register-listener" + ] + }, + { + "description": "notification:deny-remove-active -> Denies the remove_active command without any pre-configured scope.", + "type": "string", + "enum": [ + "notification:deny-remove-active" + ] + }, + { + "description": "notification:deny-request-permission -> Denies the request_permission command without any pre-configured scope.", + "type": "string", + "enum": [ + "notification:deny-request-permission" + ] + }, + { + "description": "notification:deny-show -> Denies the show command without any pre-configured scope.", + "type": "string", + "enum": [ + "notification:deny-show" + ] + }, + { + "description": "os:default -> This permission set configures which\noperating system information are available\nto gather from the frontend.\n\n#### Granted Permissions\n\nAll information except the host name are available.\n\n", + "type": "string", + "enum": [ + "os:default" + ] + }, + { + "description": "os:allow-arch -> Enables the arch command without any pre-configured scope.", + "type": "string", + "enum": [ + "os:allow-arch" + ] + }, + { + "description": "os:allow-exe-extension -> Enables the exe_extension command without any pre-configured scope.", + "type": "string", + "enum": [ + "os:allow-exe-extension" + ] + }, + { + "description": "os:allow-family -> Enables the family command without any pre-configured scope.", + "type": "string", + "enum": [ + "os:allow-family" + ] + }, + { + "description": "os:allow-hostname -> Enables the hostname command without any pre-configured scope.", + "type": "string", + "enum": [ + "os:allow-hostname" + ] + }, + { + "description": "os:allow-locale -> Enables the locale command without any pre-configured scope.", + "type": "string", + "enum": [ + "os:allow-locale" + ] + }, + { + "description": "os:allow-os-type -> Enables the os_type command without any pre-configured scope.", + "type": "string", + "enum": [ + "os:allow-os-type" + ] + }, + { + "description": "os:allow-platform -> Enables the platform command without any pre-configured scope.", + "type": "string", + "enum": [ + "os:allow-platform" + ] + }, + { + "description": "os:allow-version -> Enables the version command without any pre-configured scope.", + "type": "string", + "enum": [ + "os:allow-version" + ] + }, + { + "description": "os:deny-arch -> Denies the arch command without any pre-configured scope.", + "type": "string", + "enum": [ + "os:deny-arch" + ] + }, + { + "description": "os:deny-exe-extension -> Denies the exe_extension command without any pre-configured scope.", + "type": "string", + "enum": [ + "os:deny-exe-extension" + ] + }, + { + "description": "os:deny-family -> Denies the family command without any pre-configured scope.", + "type": "string", + "enum": [ + "os:deny-family" + ] + }, + { + "description": "os:deny-hostname -> Denies the hostname command without any pre-configured scope.", + "type": "string", + "enum": [ + "os:deny-hostname" + ] + }, + { + "description": "os:deny-locale -> Denies the locale command without any pre-configured scope.", + "type": "string", + "enum": [ + "os:deny-locale" + ] + }, + { + "description": "os:deny-os-type -> Denies the os_type command without any pre-configured scope.", + "type": "string", + "enum": [ + "os:deny-os-type" + ] + }, + { + "description": "os:deny-platform -> Denies the platform command without any pre-configured scope.", + "type": "string", + "enum": [ + "os:deny-platform" + ] + }, + { + "description": "os:deny-version -> Denies the version command without any pre-configured scope.", + "type": "string", + "enum": [ + "os:deny-version" + ] + }, + { + "description": "process:default -> This permission set configures which\nprocess feeatures are by default exposed.\n\n#### Granted Permissions\n\nThis enables to quit via `allow-exit` and restart via `allow-restart`\nthe application.\n", + "type": "string", + "enum": [ + "process:default" + ] + }, + { + "description": "process:allow-exit -> Enables the exit command without any pre-configured scope.", + "type": "string", + "enum": [ + "process:allow-exit" + ] + }, + { + "description": "process:allow-restart -> Enables the restart command without any pre-configured scope.", + "type": "string", + "enum": [ + "process:allow-restart" + ] + }, + { + "description": "process:deny-exit -> Denies the exit command without any pre-configured scope.", + "type": "string", + "enum": [ + "process:deny-exit" + ] + }, + { + "description": "process:deny-restart -> Denies the restart command without any pre-configured scope.", + "type": "string", + "enum": [ + "process:deny-restart" + ] + }, + { + "description": "shell:default -> This permission set configures which\nshell functionality is exposed by default.\n\n#### Granted Permissions\n\nIt allows to use the `open` functionality without any specific\nscope pre-configured. It will allow opening `http(s)://`,\n`tel:` and `mailto:` links.\n", + "type": "string", + "enum": [ + "shell:default" + ] + }, + { + "description": "shell:allow-execute -> Enables the execute command without any pre-configured scope.", + "type": "string", + "enum": [ + "shell:allow-execute" + ] + }, + { + "description": "shell:allow-kill -> Enables the kill command without any pre-configured scope.", + "type": "string", + "enum": [ + "shell:allow-kill" + ] + }, + { + "description": "shell:allow-open -> Enables the open command without any pre-configured scope.", + "type": "string", + "enum": [ + "shell:allow-open" + ] + }, + { + "description": "shell:allow-spawn -> Enables the spawn command without any pre-configured scope.", + "type": "string", + "enum": [ + "shell:allow-spawn" + ] + }, + { + "description": "shell:allow-stdin-write -> Enables the stdin_write command without any pre-configured scope.", + "type": "string", + "enum": [ + "shell:allow-stdin-write" + ] + }, + { + "description": "shell:deny-execute -> Denies the execute command without any pre-configured scope.", + "type": "string", + "enum": [ + "shell:deny-execute" + ] + }, + { + "description": "shell:deny-kill -> Denies the kill command without any pre-configured scope.", + "type": "string", + "enum": [ + "shell:deny-kill" + ] + }, + { + "description": "shell:deny-open -> Denies the open command without any pre-configured scope.", + "type": "string", + "enum": [ + "shell:deny-open" + ] + }, + { + "description": "shell:deny-spawn -> Denies the spawn command without any pre-configured scope.", + "type": "string", + "enum": [ + "shell:deny-spawn" + ] + }, + { + "description": "shell:deny-stdin-write -> Denies the stdin_write command without any pre-configured scope.", + "type": "string", + "enum": [ + "shell:deny-stdin-write" + ] + }, + { + "description": "updater:default -> This permission set configures which kind of\nupdater functions are exposed to the frontend.\n\n#### Granted Permissions\n\nThe full workflow from checking for updates to installing them\nis enabled.\n\n", + "type": "string", + "enum": [ + "updater:default" + ] + }, + { + "description": "updater:allow-check -> Enables the check command without any pre-configured scope.", + "type": "string", + "enum": [ + "updater:allow-check" + ] + }, + { + "description": "updater:allow-download -> Enables the download command without any pre-configured scope.", + "type": "string", + "enum": [ + "updater:allow-download" + ] + }, + { + "description": "updater:allow-download-and-install -> Enables the download_and_install command without any pre-configured scope.", + "type": "string", + "enum": [ + "updater:allow-download-and-install" + ] + }, + { + "description": "updater:allow-install -> Enables the install command without any pre-configured scope.", + "type": "string", + "enum": [ + "updater:allow-install" + ] + }, + { + "description": "updater:deny-check -> Denies the check command without any pre-configured scope.", + "type": "string", + "enum": [ + "updater:deny-check" + ] + }, + { + "description": "updater:deny-download -> Denies the download command without any pre-configured scope.", + "type": "string", + "enum": [ + "updater:deny-download" + ] + }, + { + "description": "updater:deny-download-and-install -> Denies the download_and_install command without any pre-configured scope.", + "type": "string", + "enum": [ + "updater:deny-download-and-install" + ] + }, + { + "description": "updater:deny-install -> Denies the install command without any pre-configured scope.", + "type": "string", + "enum": [ + "updater:deny-install" + ] + } + ] + }, + "Value": { + "description": "All supported ACL values.", + "anyOf": [ + { + "description": "Represents a null JSON value.", + "type": "null" + }, + { + "description": "Represents a [`bool`].", + "type": "boolean" + }, + { + "description": "Represents a valid ACL [`Number`].", + "allOf": [ + { + "$ref": "#/definitions/Number" + } + ] + }, + { + "description": "Represents a [`String`].", + "type": "string" + }, + { + "description": "Represents a list of other [`Value`]s.", + "type": "array", + "items": { + "$ref": "#/definitions/Value" + } + }, + { + "description": "Represents a map of [`String`] keys to [`Value`]s.", + "type": "object", + "additionalProperties": { + "$ref": "#/definitions/Value" + } + } + ] + }, + "Number": { + "description": "A valid ACL number.", + "anyOf": [ + { + "description": "Represents an [`i64`].", + "type": "integer", + "format": "int64" + }, + { + "description": "Represents a [`f64`].", + "type": "number", + "format": "double" + } + ] + }, + "Target": { + "description": "Platform target.", + "oneOf": [ + { + "description": "MacOS.", + "type": "string", + "enum": [ + "macOS" + ] + }, + { + "description": "Windows.", + "type": "string", + "enum": [ + "windows" + ] + }, + { + "description": "Linux.", + "type": "string", + "enum": [ + "linux" + ] + }, + { + "description": "Android.", + "type": "string", + "enum": [ + "android" + ] + }, + { + "description": "iOS.", + "type": "string", + "enum": [ + "iOS" + ] + } + ] + }, + "ShellAllowedArg": { + "description": "A command argument allowed to be executed by the webview API.", + "anyOf": [ + { + "description": "A non-configurable argument that is passed to the command in the order it was specified.", + "type": "string" + }, + { + "description": "A variable that is set while calling the command from the webview API.", + "type": "object", + "required": [ + "validator" + ], + "properties": { + "raw": { + "description": "Marks the validator as a raw regex, meaning the plugin should not make any modification at runtime.\n\nThis means the regex will not match on the entire string by default, which might be exploited if your regex allow unexpected input to be considered valid. When using this option, make sure your regex is correct.", + "default": false, + "type": "boolean" + }, + "validator": { + "description": "[regex] validator to require passed values to conform to an expected input.\n\nThis will require the argument value passed to this variable to match the `validator` regex before it will be executed.\n\nThe regex string is by default surrounded by `^...$` to match the full string. For example the `https?://\\w+` regex would be registered as `^https?://\\w+$`.\n\n[regex]: ", + "type": "string" + } + }, + "additionalProperties": false + } + ] + }, + "ShellAllowedArgs": { + "description": "A set of command arguments allowed to be executed by the webview API.\n\nA value of `true` will allow any arguments to be passed to the command. `false` will disable all arguments. A list of [`ShellAllowedArg`] will set those arguments as the only valid arguments to be passed to the attached command configuration.", + "anyOf": [ + { + "description": "Use a simple boolean to allow all or disable all arguments to this command configuration.", + "type": "boolean" + }, + { + "description": "A specific set of [`ShellAllowedArg`] that are valid to call for the command configuration.", + "type": "array", + "items": { + "$ref": "#/definitions/ShellAllowedArg" + } + } + ] + } + } +} \ No newline at end of file diff --git a/clash-nyanpasu/backend/tauri/gen/schemas/windows-schema.json b/clash-nyanpasu/backend/tauri/gen/schemas/windows-schema.json new file mode 100644 index 0000000000..3fe03ed0f2 --- /dev/null +++ b/clash-nyanpasu/backend/tauri/gen/schemas/windows-schema.json @@ -0,0 +1,7244 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "CapabilityFile", + "description": "Capability formats accepted in a capability file.", + "anyOf": [ + { + "description": "A single capability.", + "allOf": [ + { + "$ref": "#/definitions/Capability" + } + ] + }, + { + "description": "A list of capabilities.", + "type": "array", + "items": { + "$ref": "#/definitions/Capability" + } + }, + { + "description": "A list of capabilities.", + "type": "object", + "required": [ + "capabilities" + ], + "properties": { + "capabilities": { + "description": "The list of capabilities.", + "type": "array", + "items": { + "$ref": "#/definitions/Capability" + } + } + } + } + ], + "definitions": { + "Capability": { + "description": "A grouping and boundary mechanism developers can use to isolate access to the IPC layer.\n\nIt controls application windows fine grained access to the Tauri core, application, or plugin commands. If a window is not matching any capability then it has no access to the IPC layer at all.\n\nThis can be done to create groups of windows, based on their required system access, which can reduce impact of frontend vulnerabilities in less privileged windows. Windows can be added to a capability by exact name (e.g. `main-window`) or glob patterns like `*` or `admin-*`. A Window can have none, one, or multiple associated capabilities.\n\n## Example\n\n```json { \"identifier\": \"main-user-files-write\", \"description\": \"This capability allows the `main` window on macOS and Windows access to `filesystem` write related commands and `dialog` commands to enable programatic access to files selected by the user.\", \"windows\": [ \"main\" ], \"permissions\": [ \"core:default\", \"dialog:open\", { \"identifier\": \"fs:allow-write-text-file\", \"allow\": [{ \"path\": \"$HOME/test.txt\" }] }, \"platforms\": [\"macOS\",\"windows\"] } ```", + "type": "object", + "required": [ + "identifier", + "permissions" + ], + "properties": { + "identifier": { + "description": "Identifier of the capability.\n\n## Example\n\n`main-user-files-write`", + "type": "string" + }, + "description": { + "description": "Description of what the capability is intended to allow on associated windows.\n\nIt should contain a description of what the grouped permissions should allow.\n\n## Example\n\nThis capability allows the `main` window access to `filesystem` write related commands and `dialog` commands to enable programatic access to files selected by the user.", + "default": "", + "type": "string" + }, + "remote": { + "description": "Configure remote URLs that can use the capability permissions.\n\nThis setting is optional and defaults to not being set, as our default use case is that the content is served from our local application.\n\n:::caution Make sure you understand the security implications of providing remote sources with local system access. :::\n\n## Example\n\n```json { \"urls\": [\"https://*.mydomain.dev\"] } ```", + "anyOf": [ + { + "$ref": "#/definitions/CapabilityRemote" + }, + { + "type": "null" + } + ] + }, + "local": { + "description": "Whether this capability is enabled for local app URLs or not. Defaults to `true`.", + "default": true, + "type": "boolean" + }, + "windows": { + "description": "List of windows that are affected by this capability. Can be a glob pattern.\n\nOn multiwebview windows, prefer [`Self::webviews`] for a fine grained access control.\n\n## Example\n\n`[\"main\"]`", + "type": "array", + "items": { + "type": "string" + } + }, + "webviews": { + "description": "List of webviews that are affected by this capability. Can be a glob pattern.\n\nThis is only required when using on multiwebview contexts, by default all child webviews of a window that matches [`Self::windows`] are linked.\n\n## Example\n\n`[\"sub-webview-one\", \"sub-webview-two\"]`", + "type": "array", + "items": { + "type": "string" + } + }, + "permissions": { + "description": "List of permissions attached to this capability.\n\nMust include the plugin name as prefix in the form of `${plugin-name}:${permission-name}`. For commands directly implemented in the application itself only `${permission-name}` is required.\n\n## Example\n\n```json [ \"core:default\", \"shell:allow-open\", \"dialog:open\", { \"identifier\": \"fs:allow-write-text-file\", \"allow\": [{ \"path\": \"$HOME/test.txt\" }] } ```", + "type": "array", + "items": { + "$ref": "#/definitions/PermissionEntry" + }, + "uniqueItems": true + }, + "platforms": { + "description": "Limit which target platforms this capability applies to.\n\nBy default all platforms are targeted.\n\n## Example\n\n`[\"macOS\",\"windows\"]`", + "type": [ + "array", + "null" + ], + "items": { + "$ref": "#/definitions/Target" + } + } + } + }, + "CapabilityRemote": { + "description": "Configuration for remote URLs that are associated with the capability.", + "type": "object", + "required": [ + "urls" + ], + "properties": { + "urls": { + "description": "Remote domains this capability refers to using the [URLPattern standard](https://urlpattern.spec.whatwg.org/).\n\n## Examples\n\n- \"https://*.mydomain.dev\": allows subdomains of mydomain.dev - \"https://mydomain.dev/api/*\": allows any subpath of mydomain.dev/api", + "type": "array", + "items": { + "type": "string" + } + } + } + }, + "PermissionEntry": { + "description": "An entry for a permission value in a [`Capability`] can be either a raw permission [`Identifier`] or an object that references a permission and extends its scope.", + "anyOf": [ + { + "description": "Reference a permission or permission set by identifier.", + "allOf": [ + { + "$ref": "#/definitions/Identifier" + } + ] + }, + { + "description": "Reference a permission or permission set by identifier and extends its scope.", + "type": "object", + "oneOf": [ + { + "type": "object", + "required": [ + "identifier" + ], + "properties": { + "identifier": { + "oneOf": [ + { + "description": "fs:default -> This set of permissions describes the what kind of\nfile system access the `fs` plugin has enabled or denied by default.\n\n#### Granted Permissions\n\nThis default permission set enables read access to the\napplication specific directories (AppConfig, AppData, AppLocalData, AppCache,\nAppLog) and all files and sub directories created in it.\nThe location of these directories depends on the operating system,\nwhere the application is run.\n\nIn general these directories need to be manually created\nby the application at runtime, before accessing files or folders\nin it is possible.\n\nTherefore, it is also allowed to create all of these folders via\nthe `mkdir` command.\n\n#### Denied Permissions\n\nThis default permission set prevents access to critical components\nof the Tauri application by default.\nOn Windows the webview data folder access is denied.\n\n", + "type": "string", + "enum": [ + "fs:default" + ] + }, + { + "description": "fs:allow-app-meta -> This allows non-recursive read access to metadata of the `$APP` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-app-meta" + ] + }, + { + "description": "fs:allow-app-meta-recursive -> This allows full recursive read access to metadata of the `$APP` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-app-meta-recursive" + ] + }, + { + "description": "fs:allow-app-read -> This allows non-recursive read access to the `$APP` folder.", + "type": "string", + "enum": [ + "fs:allow-app-read" + ] + }, + { + "description": "fs:allow-app-read-recursive -> This allows full recursive read access to the complete `$APP` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-app-read-recursive" + ] + }, + { + "description": "fs:allow-app-write -> This allows non-recursive write access to the `$APP` folder.", + "type": "string", + "enum": [ + "fs:allow-app-write" + ] + }, + { + "description": "fs:allow-app-write-recursive -> This allows full recursive write access to the complete `$APP` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-app-write-recursive" + ] + }, + { + "description": "fs:allow-appcache-meta -> This allows non-recursive read access to metadata of the `$APPCACHE` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-appcache-meta" + ] + }, + { + "description": "fs:allow-appcache-meta-recursive -> This allows full recursive read access to metadata of the `$APPCACHE` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-appcache-meta-recursive" + ] + }, + { + "description": "fs:allow-appcache-read -> This allows non-recursive read access to the `$APPCACHE` folder.", + "type": "string", + "enum": [ + "fs:allow-appcache-read" + ] + }, + { + "description": "fs:allow-appcache-read-recursive -> This allows full recursive read access to the complete `$APPCACHE` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-appcache-read-recursive" + ] + }, + { + "description": "fs:allow-appcache-write -> This allows non-recursive write access to the `$APPCACHE` folder.", + "type": "string", + "enum": [ + "fs:allow-appcache-write" + ] + }, + { + "description": "fs:allow-appcache-write-recursive -> This allows full recursive write access to the complete `$APPCACHE` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-appcache-write-recursive" + ] + }, + { + "description": "fs:allow-appconfig-meta -> This allows non-recursive read access to metadata of the `$APPCONFIG` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-appconfig-meta" + ] + }, + { + "description": "fs:allow-appconfig-meta-recursive -> This allows full recursive read access to metadata of the `$APPCONFIG` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-appconfig-meta-recursive" + ] + }, + { + "description": "fs:allow-appconfig-read -> This allows non-recursive read access to the `$APPCONFIG` folder.", + "type": "string", + "enum": [ + "fs:allow-appconfig-read" + ] + }, + { + "description": "fs:allow-appconfig-read-recursive -> This allows full recursive read access to the complete `$APPCONFIG` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-appconfig-read-recursive" + ] + }, + { + "description": "fs:allow-appconfig-write -> This allows non-recursive write access to the `$APPCONFIG` folder.", + "type": "string", + "enum": [ + "fs:allow-appconfig-write" + ] + }, + { + "description": "fs:allow-appconfig-write-recursive -> This allows full recursive write access to the complete `$APPCONFIG` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-appconfig-write-recursive" + ] + }, + { + "description": "fs:allow-appdata-meta -> This allows non-recursive read access to metadata of the `$APPDATA` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-appdata-meta" + ] + }, + { + "description": "fs:allow-appdata-meta-recursive -> This allows full recursive read access to metadata of the `$APPDATA` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-appdata-meta-recursive" + ] + }, + { + "description": "fs:allow-appdata-read -> This allows non-recursive read access to the `$APPDATA` folder.", + "type": "string", + "enum": [ + "fs:allow-appdata-read" + ] + }, + { + "description": "fs:allow-appdata-read-recursive -> This allows full recursive read access to the complete `$APPDATA` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-appdata-read-recursive" + ] + }, + { + "description": "fs:allow-appdata-write -> This allows non-recursive write access to the `$APPDATA` folder.", + "type": "string", + "enum": [ + "fs:allow-appdata-write" + ] + }, + { + "description": "fs:allow-appdata-write-recursive -> This allows full recursive write access to the complete `$APPDATA` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-appdata-write-recursive" + ] + }, + { + "description": "fs:allow-applocaldata-meta -> This allows non-recursive read access to metadata of the `$APPLOCALDATA` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-applocaldata-meta" + ] + }, + { + "description": "fs:allow-applocaldata-meta-recursive -> This allows full recursive read access to metadata of the `$APPLOCALDATA` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-applocaldata-meta-recursive" + ] + }, + { + "description": "fs:allow-applocaldata-read -> This allows non-recursive read access to the `$APPLOCALDATA` folder.", + "type": "string", + "enum": [ + "fs:allow-applocaldata-read" + ] + }, + { + "description": "fs:allow-applocaldata-read-recursive -> This allows full recursive read access to the complete `$APPLOCALDATA` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-applocaldata-read-recursive" + ] + }, + { + "description": "fs:allow-applocaldata-write -> This allows non-recursive write access to the `$APPLOCALDATA` folder.", + "type": "string", + "enum": [ + "fs:allow-applocaldata-write" + ] + }, + { + "description": "fs:allow-applocaldata-write-recursive -> This allows full recursive write access to the complete `$APPLOCALDATA` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-applocaldata-write-recursive" + ] + }, + { + "description": "fs:allow-applog-meta -> This allows non-recursive read access to metadata of the `$APPLOG` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-applog-meta" + ] + }, + { + "description": "fs:allow-applog-meta-recursive -> This allows full recursive read access to metadata of the `$APPLOG` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-applog-meta-recursive" + ] + }, + { + "description": "fs:allow-applog-read -> This allows non-recursive read access to the `$APPLOG` folder.", + "type": "string", + "enum": [ + "fs:allow-applog-read" + ] + }, + { + "description": "fs:allow-applog-read-recursive -> This allows full recursive read access to the complete `$APPLOG` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-applog-read-recursive" + ] + }, + { + "description": "fs:allow-applog-write -> This allows non-recursive write access to the `$APPLOG` folder.", + "type": "string", + "enum": [ + "fs:allow-applog-write" + ] + }, + { + "description": "fs:allow-applog-write-recursive -> This allows full recursive write access to the complete `$APPLOG` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-applog-write-recursive" + ] + }, + { + "description": "fs:allow-audio-meta -> This allows non-recursive read access to metadata of the `$AUDIO` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-audio-meta" + ] + }, + { + "description": "fs:allow-audio-meta-recursive -> This allows full recursive read access to metadata of the `$AUDIO` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-audio-meta-recursive" + ] + }, + { + "description": "fs:allow-audio-read -> This allows non-recursive read access to the `$AUDIO` folder.", + "type": "string", + "enum": [ + "fs:allow-audio-read" + ] + }, + { + "description": "fs:allow-audio-read-recursive -> This allows full recursive read access to the complete `$AUDIO` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-audio-read-recursive" + ] + }, + { + "description": "fs:allow-audio-write -> This allows non-recursive write access to the `$AUDIO` folder.", + "type": "string", + "enum": [ + "fs:allow-audio-write" + ] + }, + { + "description": "fs:allow-audio-write-recursive -> This allows full recursive write access to the complete `$AUDIO` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-audio-write-recursive" + ] + }, + { + "description": "fs:allow-cache-meta -> This allows non-recursive read access to metadata of the `$CACHE` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-cache-meta" + ] + }, + { + "description": "fs:allow-cache-meta-recursive -> This allows full recursive read access to metadata of the `$CACHE` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-cache-meta-recursive" + ] + }, + { + "description": "fs:allow-cache-read -> This allows non-recursive read access to the `$CACHE` folder.", + "type": "string", + "enum": [ + "fs:allow-cache-read" + ] + }, + { + "description": "fs:allow-cache-read-recursive -> This allows full recursive read access to the complete `$CACHE` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-cache-read-recursive" + ] + }, + { + "description": "fs:allow-cache-write -> This allows non-recursive write access to the `$CACHE` folder.", + "type": "string", + "enum": [ + "fs:allow-cache-write" + ] + }, + { + "description": "fs:allow-cache-write-recursive -> This allows full recursive write access to the complete `$CACHE` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-cache-write-recursive" + ] + }, + { + "description": "fs:allow-config-meta -> This allows non-recursive read access to metadata of the `$CONFIG` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-config-meta" + ] + }, + { + "description": "fs:allow-config-meta-recursive -> This allows full recursive read access to metadata of the `$CONFIG` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-config-meta-recursive" + ] + }, + { + "description": "fs:allow-config-read -> This allows non-recursive read access to the `$CONFIG` folder.", + "type": "string", + "enum": [ + "fs:allow-config-read" + ] + }, + { + "description": "fs:allow-config-read-recursive -> This allows full recursive read access to the complete `$CONFIG` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-config-read-recursive" + ] + }, + { + "description": "fs:allow-config-write -> This allows non-recursive write access to the `$CONFIG` folder.", + "type": "string", + "enum": [ + "fs:allow-config-write" + ] + }, + { + "description": "fs:allow-config-write-recursive -> This allows full recursive write access to the complete `$CONFIG` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-config-write-recursive" + ] + }, + { + "description": "fs:allow-data-meta -> This allows non-recursive read access to metadata of the `$DATA` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-data-meta" + ] + }, + { + "description": "fs:allow-data-meta-recursive -> This allows full recursive read access to metadata of the `$DATA` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-data-meta-recursive" + ] + }, + { + "description": "fs:allow-data-read -> This allows non-recursive read access to the `$DATA` folder.", + "type": "string", + "enum": [ + "fs:allow-data-read" + ] + }, + { + "description": "fs:allow-data-read-recursive -> This allows full recursive read access to the complete `$DATA` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-data-read-recursive" + ] + }, + { + "description": "fs:allow-data-write -> This allows non-recursive write access to the `$DATA` folder.", + "type": "string", + "enum": [ + "fs:allow-data-write" + ] + }, + { + "description": "fs:allow-data-write-recursive -> This allows full recursive write access to the complete `$DATA` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-data-write-recursive" + ] + }, + { + "description": "fs:allow-desktop-meta -> This allows non-recursive read access to metadata of the `$DESKTOP` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-desktop-meta" + ] + }, + { + "description": "fs:allow-desktop-meta-recursive -> This allows full recursive read access to metadata of the `$DESKTOP` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-desktop-meta-recursive" + ] + }, + { + "description": "fs:allow-desktop-read -> This allows non-recursive read access to the `$DESKTOP` folder.", + "type": "string", + "enum": [ + "fs:allow-desktop-read" + ] + }, + { + "description": "fs:allow-desktop-read-recursive -> This allows full recursive read access to the complete `$DESKTOP` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-desktop-read-recursive" + ] + }, + { + "description": "fs:allow-desktop-write -> This allows non-recursive write access to the `$DESKTOP` folder.", + "type": "string", + "enum": [ + "fs:allow-desktop-write" + ] + }, + { + "description": "fs:allow-desktop-write-recursive -> This allows full recursive write access to the complete `$DESKTOP` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-desktop-write-recursive" + ] + }, + { + "description": "fs:allow-document-meta -> This allows non-recursive read access to metadata of the `$DOCUMENT` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-document-meta" + ] + }, + { + "description": "fs:allow-document-meta-recursive -> This allows full recursive read access to metadata of the `$DOCUMENT` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-document-meta-recursive" + ] + }, + { + "description": "fs:allow-document-read -> This allows non-recursive read access to the `$DOCUMENT` folder.", + "type": "string", + "enum": [ + "fs:allow-document-read" + ] + }, + { + "description": "fs:allow-document-read-recursive -> This allows full recursive read access to the complete `$DOCUMENT` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-document-read-recursive" + ] + }, + { + "description": "fs:allow-document-write -> This allows non-recursive write access to the `$DOCUMENT` folder.", + "type": "string", + "enum": [ + "fs:allow-document-write" + ] + }, + { + "description": "fs:allow-document-write-recursive -> This allows full recursive write access to the complete `$DOCUMENT` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-document-write-recursive" + ] + }, + { + "description": "fs:allow-download-meta -> This allows non-recursive read access to metadata of the `$DOWNLOAD` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-download-meta" + ] + }, + { + "description": "fs:allow-download-meta-recursive -> This allows full recursive read access to metadata of the `$DOWNLOAD` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-download-meta-recursive" + ] + }, + { + "description": "fs:allow-download-read -> This allows non-recursive read access to the `$DOWNLOAD` folder.", + "type": "string", + "enum": [ + "fs:allow-download-read" + ] + }, + { + "description": "fs:allow-download-read-recursive -> This allows full recursive read access to the complete `$DOWNLOAD` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-download-read-recursive" + ] + }, + { + "description": "fs:allow-download-write -> This allows non-recursive write access to the `$DOWNLOAD` folder.", + "type": "string", + "enum": [ + "fs:allow-download-write" + ] + }, + { + "description": "fs:allow-download-write-recursive -> This allows full recursive write access to the complete `$DOWNLOAD` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-download-write-recursive" + ] + }, + { + "description": "fs:allow-exe-meta -> This allows non-recursive read access to metadata of the `$EXE` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-exe-meta" + ] + }, + { + "description": "fs:allow-exe-meta-recursive -> This allows full recursive read access to metadata of the `$EXE` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-exe-meta-recursive" + ] + }, + { + "description": "fs:allow-exe-read -> This allows non-recursive read access to the `$EXE` folder.", + "type": "string", + "enum": [ + "fs:allow-exe-read" + ] + }, + { + "description": "fs:allow-exe-read-recursive -> This allows full recursive read access to the complete `$EXE` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-exe-read-recursive" + ] + }, + { + "description": "fs:allow-exe-write -> This allows non-recursive write access to the `$EXE` folder.", + "type": "string", + "enum": [ + "fs:allow-exe-write" + ] + }, + { + "description": "fs:allow-exe-write-recursive -> This allows full recursive write access to the complete `$EXE` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-exe-write-recursive" + ] + }, + { + "description": "fs:allow-font-meta -> This allows non-recursive read access to metadata of the `$FONT` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-font-meta" + ] + }, + { + "description": "fs:allow-font-meta-recursive -> This allows full recursive read access to metadata of the `$FONT` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-font-meta-recursive" + ] + }, + { + "description": "fs:allow-font-read -> This allows non-recursive read access to the `$FONT` folder.", + "type": "string", + "enum": [ + "fs:allow-font-read" + ] + }, + { + "description": "fs:allow-font-read-recursive -> This allows full recursive read access to the complete `$FONT` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-font-read-recursive" + ] + }, + { + "description": "fs:allow-font-write -> This allows non-recursive write access to the `$FONT` folder.", + "type": "string", + "enum": [ + "fs:allow-font-write" + ] + }, + { + "description": "fs:allow-font-write-recursive -> This allows full recursive write access to the complete `$FONT` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-font-write-recursive" + ] + }, + { + "description": "fs:allow-home-meta -> This allows non-recursive read access to metadata of the `$HOME` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-home-meta" + ] + }, + { + "description": "fs:allow-home-meta-recursive -> This allows full recursive read access to metadata of the `$HOME` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-home-meta-recursive" + ] + }, + { + "description": "fs:allow-home-read -> This allows non-recursive read access to the `$HOME` folder.", + "type": "string", + "enum": [ + "fs:allow-home-read" + ] + }, + { + "description": "fs:allow-home-read-recursive -> This allows full recursive read access to the complete `$HOME` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-home-read-recursive" + ] + }, + { + "description": "fs:allow-home-write -> This allows non-recursive write access to the `$HOME` folder.", + "type": "string", + "enum": [ + "fs:allow-home-write" + ] + }, + { + "description": "fs:allow-home-write-recursive -> This allows full recursive write access to the complete `$HOME` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-home-write-recursive" + ] + }, + { + "description": "fs:allow-localdata-meta -> This allows non-recursive read access to metadata of the `$LOCALDATA` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-localdata-meta" + ] + }, + { + "description": "fs:allow-localdata-meta-recursive -> This allows full recursive read access to metadata of the `$LOCALDATA` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-localdata-meta-recursive" + ] + }, + { + "description": "fs:allow-localdata-read -> This allows non-recursive read access to the `$LOCALDATA` folder.", + "type": "string", + "enum": [ + "fs:allow-localdata-read" + ] + }, + { + "description": "fs:allow-localdata-read-recursive -> This allows full recursive read access to the complete `$LOCALDATA` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-localdata-read-recursive" + ] + }, + { + "description": "fs:allow-localdata-write -> This allows non-recursive write access to the `$LOCALDATA` folder.", + "type": "string", + "enum": [ + "fs:allow-localdata-write" + ] + }, + { + "description": "fs:allow-localdata-write-recursive -> This allows full recursive write access to the complete `$LOCALDATA` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-localdata-write-recursive" + ] + }, + { + "description": "fs:allow-log-meta -> This allows non-recursive read access to metadata of the `$LOG` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-log-meta" + ] + }, + { + "description": "fs:allow-log-meta-recursive -> This allows full recursive read access to metadata of the `$LOG` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-log-meta-recursive" + ] + }, + { + "description": "fs:allow-log-read -> This allows non-recursive read access to the `$LOG` folder.", + "type": "string", + "enum": [ + "fs:allow-log-read" + ] + }, + { + "description": "fs:allow-log-read-recursive -> This allows full recursive read access to the complete `$LOG` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-log-read-recursive" + ] + }, + { + "description": "fs:allow-log-write -> This allows non-recursive write access to the `$LOG` folder.", + "type": "string", + "enum": [ + "fs:allow-log-write" + ] + }, + { + "description": "fs:allow-log-write-recursive -> This allows full recursive write access to the complete `$LOG` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-log-write-recursive" + ] + }, + { + "description": "fs:allow-picture-meta -> This allows non-recursive read access to metadata of the `$PICTURE` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-picture-meta" + ] + }, + { + "description": "fs:allow-picture-meta-recursive -> This allows full recursive read access to metadata of the `$PICTURE` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-picture-meta-recursive" + ] + }, + { + "description": "fs:allow-picture-read -> This allows non-recursive read access to the `$PICTURE` folder.", + "type": "string", + "enum": [ + "fs:allow-picture-read" + ] + }, + { + "description": "fs:allow-picture-read-recursive -> This allows full recursive read access to the complete `$PICTURE` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-picture-read-recursive" + ] + }, + { + "description": "fs:allow-picture-write -> This allows non-recursive write access to the `$PICTURE` folder.", + "type": "string", + "enum": [ + "fs:allow-picture-write" + ] + }, + { + "description": "fs:allow-picture-write-recursive -> This allows full recursive write access to the complete `$PICTURE` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-picture-write-recursive" + ] + }, + { + "description": "fs:allow-public-meta -> This allows non-recursive read access to metadata of the `$PUBLIC` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-public-meta" + ] + }, + { + "description": "fs:allow-public-meta-recursive -> This allows full recursive read access to metadata of the `$PUBLIC` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-public-meta-recursive" + ] + }, + { + "description": "fs:allow-public-read -> This allows non-recursive read access to the `$PUBLIC` folder.", + "type": "string", + "enum": [ + "fs:allow-public-read" + ] + }, + { + "description": "fs:allow-public-read-recursive -> This allows full recursive read access to the complete `$PUBLIC` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-public-read-recursive" + ] + }, + { + "description": "fs:allow-public-write -> This allows non-recursive write access to the `$PUBLIC` folder.", + "type": "string", + "enum": [ + "fs:allow-public-write" + ] + }, + { + "description": "fs:allow-public-write-recursive -> This allows full recursive write access to the complete `$PUBLIC` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-public-write-recursive" + ] + }, + { + "description": "fs:allow-resource-meta -> This allows non-recursive read access to metadata of the `$RESOURCE` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-resource-meta" + ] + }, + { + "description": "fs:allow-resource-meta-recursive -> This allows full recursive read access to metadata of the `$RESOURCE` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-resource-meta-recursive" + ] + }, + { + "description": "fs:allow-resource-read -> This allows non-recursive read access to the `$RESOURCE` folder.", + "type": "string", + "enum": [ + "fs:allow-resource-read" + ] + }, + { + "description": "fs:allow-resource-read-recursive -> This allows full recursive read access to the complete `$RESOURCE` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-resource-read-recursive" + ] + }, + { + "description": "fs:allow-resource-write -> This allows non-recursive write access to the `$RESOURCE` folder.", + "type": "string", + "enum": [ + "fs:allow-resource-write" + ] + }, + { + "description": "fs:allow-resource-write-recursive -> This allows full recursive write access to the complete `$RESOURCE` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-resource-write-recursive" + ] + }, + { + "description": "fs:allow-runtime-meta -> This allows non-recursive read access to metadata of the `$RUNTIME` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-runtime-meta" + ] + }, + { + "description": "fs:allow-runtime-meta-recursive -> This allows full recursive read access to metadata of the `$RUNTIME` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-runtime-meta-recursive" + ] + }, + { + "description": "fs:allow-runtime-read -> This allows non-recursive read access to the `$RUNTIME` folder.", + "type": "string", + "enum": [ + "fs:allow-runtime-read" + ] + }, + { + "description": "fs:allow-runtime-read-recursive -> This allows full recursive read access to the complete `$RUNTIME` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-runtime-read-recursive" + ] + }, + { + "description": "fs:allow-runtime-write -> This allows non-recursive write access to the `$RUNTIME` folder.", + "type": "string", + "enum": [ + "fs:allow-runtime-write" + ] + }, + { + "description": "fs:allow-runtime-write-recursive -> This allows full recursive write access to the complete `$RUNTIME` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-runtime-write-recursive" + ] + }, + { + "description": "fs:allow-temp-meta -> This allows non-recursive read access to metadata of the `$TEMP` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-temp-meta" + ] + }, + { + "description": "fs:allow-temp-meta-recursive -> This allows full recursive read access to metadata of the `$TEMP` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-temp-meta-recursive" + ] + }, + { + "description": "fs:allow-temp-read -> This allows non-recursive read access to the `$TEMP` folder.", + "type": "string", + "enum": [ + "fs:allow-temp-read" + ] + }, + { + "description": "fs:allow-temp-read-recursive -> This allows full recursive read access to the complete `$TEMP` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-temp-read-recursive" + ] + }, + { + "description": "fs:allow-temp-write -> This allows non-recursive write access to the `$TEMP` folder.", + "type": "string", + "enum": [ + "fs:allow-temp-write" + ] + }, + { + "description": "fs:allow-temp-write-recursive -> This allows full recursive write access to the complete `$TEMP` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-temp-write-recursive" + ] + }, + { + "description": "fs:allow-template-meta -> This allows non-recursive read access to metadata of the `$TEMPLATE` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-template-meta" + ] + }, + { + "description": "fs:allow-template-meta-recursive -> This allows full recursive read access to metadata of the `$TEMPLATE` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-template-meta-recursive" + ] + }, + { + "description": "fs:allow-template-read -> This allows non-recursive read access to the `$TEMPLATE` folder.", + "type": "string", + "enum": [ + "fs:allow-template-read" + ] + }, + { + "description": "fs:allow-template-read-recursive -> This allows full recursive read access to the complete `$TEMPLATE` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-template-read-recursive" + ] + }, + { + "description": "fs:allow-template-write -> This allows non-recursive write access to the `$TEMPLATE` folder.", + "type": "string", + "enum": [ + "fs:allow-template-write" + ] + }, + { + "description": "fs:allow-template-write-recursive -> This allows full recursive write access to the complete `$TEMPLATE` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-template-write-recursive" + ] + }, + { + "description": "fs:allow-video-meta -> This allows non-recursive read access to metadata of the `$VIDEO` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-video-meta" + ] + }, + { + "description": "fs:allow-video-meta-recursive -> This allows full recursive read access to metadata of the `$VIDEO` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-video-meta-recursive" + ] + }, + { + "description": "fs:allow-video-read -> This allows non-recursive read access to the `$VIDEO` folder.", + "type": "string", + "enum": [ + "fs:allow-video-read" + ] + }, + { + "description": "fs:allow-video-read-recursive -> This allows full recursive read access to the complete `$VIDEO` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-video-read-recursive" + ] + }, + { + "description": "fs:allow-video-write -> This allows non-recursive write access to the `$VIDEO` folder.", + "type": "string", + "enum": [ + "fs:allow-video-write" + ] + }, + { + "description": "fs:allow-video-write-recursive -> This allows full recursive write access to the complete `$VIDEO` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-video-write-recursive" + ] + }, + { + "description": "fs:deny-default -> This denies access to dangerous Tauri relevant files and folders by default.", + "type": "string", + "enum": [ + "fs:deny-default" + ] + }, + { + "description": "fs:allow-copy-file -> Enables the copy_file command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:allow-copy-file" + ] + }, + { + "description": "fs:allow-create -> Enables the create command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:allow-create" + ] + }, + { + "description": "fs:allow-exists -> Enables the exists command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:allow-exists" + ] + }, + { + "description": "fs:allow-fstat -> Enables the fstat command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:allow-fstat" + ] + }, + { + "description": "fs:allow-ftruncate -> Enables the ftruncate command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:allow-ftruncate" + ] + }, + { + "description": "fs:allow-lstat -> Enables the lstat command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:allow-lstat" + ] + }, + { + "description": "fs:allow-mkdir -> Enables the mkdir command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:allow-mkdir" + ] + }, + { + "description": "fs:allow-open -> Enables the open command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:allow-open" + ] + }, + { + "description": "fs:allow-read -> Enables the read command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:allow-read" + ] + }, + { + "description": "fs:allow-read-dir -> Enables the read_dir command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:allow-read-dir" + ] + }, + { + "description": "fs:allow-read-file -> Enables the read_file command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:allow-read-file" + ] + }, + { + "description": "fs:allow-read-text-file -> Enables the read_text_file command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:allow-read-text-file" + ] + }, + { + "description": "fs:allow-read-text-file-lines -> Enables the read_text_file_lines command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:allow-read-text-file-lines" + ] + }, + { + "description": "fs:allow-read-text-file-lines-next -> Enables the read_text_file_lines_next command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:allow-read-text-file-lines-next" + ] + }, + { + "description": "fs:allow-remove -> Enables the remove command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:allow-remove" + ] + }, + { + "description": "fs:allow-rename -> Enables the rename command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:allow-rename" + ] + }, + { + "description": "fs:allow-seek -> Enables the seek command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:allow-seek" + ] + }, + { + "description": "fs:allow-stat -> Enables the stat command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:allow-stat" + ] + }, + { + "description": "fs:allow-truncate -> Enables the truncate command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:allow-truncate" + ] + }, + { + "description": "fs:allow-unwatch -> Enables the unwatch command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:allow-unwatch" + ] + }, + { + "description": "fs:allow-watch -> Enables the watch command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:allow-watch" + ] + }, + { + "description": "fs:allow-write -> Enables the write command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:allow-write" + ] + }, + { + "description": "fs:allow-write-file -> Enables the write_file command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:allow-write-file" + ] + }, + { + "description": "fs:allow-write-text-file -> Enables the write_text_file command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:allow-write-text-file" + ] + }, + { + "description": "fs:create-app-specific-dirs -> This permissions allows to create the application specific directories.\n", + "type": "string", + "enum": [ + "fs:create-app-specific-dirs" + ] + }, + { + "description": "fs:deny-copy-file -> Denies the copy_file command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:deny-copy-file" + ] + }, + { + "description": "fs:deny-create -> Denies the create command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:deny-create" + ] + }, + { + "description": "fs:deny-exists -> Denies the exists command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:deny-exists" + ] + }, + { + "description": "fs:deny-fstat -> Denies the fstat command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:deny-fstat" + ] + }, + { + "description": "fs:deny-ftruncate -> Denies the ftruncate command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:deny-ftruncate" + ] + }, + { + "description": "fs:deny-lstat -> Denies the lstat command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:deny-lstat" + ] + }, + { + "description": "fs:deny-mkdir -> Denies the mkdir command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:deny-mkdir" + ] + }, + { + "description": "fs:deny-open -> Denies the open command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:deny-open" + ] + }, + { + "description": "fs:deny-read -> Denies the read command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:deny-read" + ] + }, + { + "description": "fs:deny-read-dir -> Denies the read_dir command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:deny-read-dir" + ] + }, + { + "description": "fs:deny-read-file -> Denies the read_file command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:deny-read-file" + ] + }, + { + "description": "fs:deny-read-text-file -> Denies the read_text_file command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:deny-read-text-file" + ] + }, + { + "description": "fs:deny-read-text-file-lines -> Denies the read_text_file_lines command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:deny-read-text-file-lines" + ] + }, + { + "description": "fs:deny-read-text-file-lines-next -> Denies the read_text_file_lines_next command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:deny-read-text-file-lines-next" + ] + }, + { + "description": "fs:deny-remove -> Denies the remove command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:deny-remove" + ] + }, + { + "description": "fs:deny-rename -> Denies the rename command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:deny-rename" + ] + }, + { + "description": "fs:deny-seek -> Denies the seek command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:deny-seek" + ] + }, + { + "description": "fs:deny-stat -> Denies the stat command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:deny-stat" + ] + }, + { + "description": "fs:deny-truncate -> Denies the truncate command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:deny-truncate" + ] + }, + { + "description": "fs:deny-unwatch -> Denies the unwatch command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:deny-unwatch" + ] + }, + { + "description": "fs:deny-watch -> Denies the watch command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:deny-watch" + ] + }, + { + "description": "fs:deny-webview-data-linux -> This denies read access to the\n`$APPLOCALDATA` folder on linux as the webview data and configuration values are stored here.\nAllowing access can lead to sensitive information disclosure and should be well considered.", + "type": "string", + "enum": [ + "fs:deny-webview-data-linux" + ] + }, + { + "description": "fs:deny-webview-data-windows -> This denies read access to the\n`$APPLOCALDATA/EBWebView` folder on windows as the webview data and configuration values are stored here.\nAllowing access can lead to sensitive information disclosure and should be well considered.", + "type": "string", + "enum": [ + "fs:deny-webview-data-windows" + ] + }, + { + "description": "fs:deny-write -> Denies the write command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:deny-write" + ] + }, + { + "description": "fs:deny-write-file -> Denies the write_file command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:deny-write-file" + ] + }, + { + "description": "fs:deny-write-text-file -> Denies the write_text_file command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:deny-write-text-file" + ] + }, + { + "description": "fs:read-all -> This enables all read related commands without any pre-configured accessible paths.", + "type": "string", + "enum": [ + "fs:read-all" + ] + }, + { + "description": "fs:read-app-specific-dirs-recursive -> This permission allows recursive read functionality on the application\nspecific base directories. \n", + "type": "string", + "enum": [ + "fs:read-app-specific-dirs-recursive" + ] + }, + { + "description": "fs:read-dirs -> This enables directory read and file metadata related commands without any pre-configured accessible paths.", + "type": "string", + "enum": [ + "fs:read-dirs" + ] + }, + { + "description": "fs:read-files -> This enables file read related commands without any pre-configured accessible paths.", + "type": "string", + "enum": [ + "fs:read-files" + ] + }, + { + "description": "fs:read-meta -> This enables all index or metadata related commands without any pre-configured accessible paths.", + "type": "string", + "enum": [ + "fs:read-meta" + ] + }, + { + "description": "fs:scope -> An empty permission you can use to modify the global scope.", + "type": "string", + "enum": [ + "fs:scope" + ] + }, + { + "description": "fs:scope-app -> This scope permits access to all files and list content of top level directories in the `$APP`folder.", + "type": "string", + "enum": [ + "fs:scope-app" + ] + }, + { + "description": "fs:scope-app-index -> This scope permits to list all files and folders in the `$APP`folder.", + "type": "string", + "enum": [ + "fs:scope-app-index" + ] + }, + { + "description": "fs:scope-app-recursive -> This scope permits recursive access to the complete `$APP` folder, including sub directories and files.", + "type": "string", + "enum": [ + "fs:scope-app-recursive" + ] + }, + { + "description": "fs:scope-appcache -> This scope permits access to all files and list content of top level directories in the `$APPCACHE`folder.", + "type": "string", + "enum": [ + "fs:scope-appcache" + ] + }, + { + "description": "fs:scope-appcache-index -> This scope permits to list all files and folders in the `$APPCACHE`folder.", + "type": "string", + "enum": [ + "fs:scope-appcache-index" + ] + }, + { + "description": "fs:scope-appcache-recursive -> This scope permits recursive access to the complete `$APPCACHE` folder, including sub directories and files.", + "type": "string", + "enum": [ + "fs:scope-appcache-recursive" + ] + }, + { + "description": "fs:scope-appconfig -> This scope permits access to all files and list content of top level directories in the `$APPCONFIG`folder.", + "type": "string", + "enum": [ + "fs:scope-appconfig" + ] + }, + { + "description": "fs:scope-appconfig-index -> This scope permits to list all files and folders in the `$APPCONFIG`folder.", + "type": "string", + "enum": [ + "fs:scope-appconfig-index" + ] + }, + { + "description": "fs:scope-appconfig-recursive -> This scope permits recursive access to the complete `$APPCONFIG` folder, including sub directories and files.", + "type": "string", + "enum": [ + "fs:scope-appconfig-recursive" + ] + }, + { + "description": "fs:scope-appdata -> This scope permits access to all files and list content of top level directories in the `$APPDATA`folder.", + "type": "string", + "enum": [ + "fs:scope-appdata" + ] + }, + { + "description": "fs:scope-appdata-index -> This scope permits to list all files and folders in the `$APPDATA`folder.", + "type": "string", + "enum": [ + "fs:scope-appdata-index" + ] + }, + { + "description": "fs:scope-appdata-recursive -> This scope permits recursive access to the complete `$APPDATA` folder, including sub directories and files.", + "type": "string", + "enum": [ + "fs:scope-appdata-recursive" + ] + }, + { + "description": "fs:scope-applocaldata -> This scope permits access to all files and list content of top level directories in the `$APPLOCALDATA`folder.", + "type": "string", + "enum": [ + "fs:scope-applocaldata" + ] + }, + { + "description": "fs:scope-applocaldata-index -> This scope permits to list all files and folders in the `$APPLOCALDATA`folder.", + "type": "string", + "enum": [ + "fs:scope-applocaldata-index" + ] + }, + { + "description": "fs:scope-applocaldata-recursive -> This scope permits recursive access to the complete `$APPLOCALDATA` folder, including sub directories and files.", + "type": "string", + "enum": [ + "fs:scope-applocaldata-recursive" + ] + }, + { + "description": "fs:scope-applog -> This scope permits access to all files and list content of top level directories in the `$APPLOG`folder.", + "type": "string", + "enum": [ + "fs:scope-applog" + ] + }, + { + "description": "fs:scope-applog-index -> This scope permits to list all files and folders in the `$APPLOG`folder.", + "type": "string", + "enum": [ + "fs:scope-applog-index" + ] + }, + { + "description": "fs:scope-applog-recursive -> This scope permits recursive access to the complete `$APPLOG` folder, including sub directories and files.", + "type": "string", + "enum": [ + "fs:scope-applog-recursive" + ] + }, + { + "description": "fs:scope-audio -> This scope permits access to all files and list content of top level directories in the `$AUDIO`folder.", + "type": "string", + "enum": [ + "fs:scope-audio" + ] + }, + { + "description": "fs:scope-audio-index -> This scope permits to list all files and folders in the `$AUDIO`folder.", + "type": "string", + "enum": [ + "fs:scope-audio-index" + ] + }, + { + "description": "fs:scope-audio-recursive -> This scope permits recursive access to the complete `$AUDIO` folder, including sub directories and files.", + "type": "string", + "enum": [ + "fs:scope-audio-recursive" + ] + }, + { + "description": "fs:scope-cache -> This scope permits access to all files and list content of top level directories in the `$CACHE`folder.", + "type": "string", + "enum": [ + "fs:scope-cache" + ] + }, + { + "description": "fs:scope-cache-index -> This scope permits to list all files and folders in the `$CACHE`folder.", + "type": "string", + "enum": [ + "fs:scope-cache-index" + ] + }, + { + "description": "fs:scope-cache-recursive -> This scope permits recursive access to the complete `$CACHE` folder, including sub directories and files.", + "type": "string", + "enum": [ + "fs:scope-cache-recursive" + ] + }, + { + "description": "fs:scope-config -> This scope permits access to all files and list content of top level directories in the `$CONFIG`folder.", + "type": "string", + "enum": [ + "fs:scope-config" + ] + }, + { + "description": "fs:scope-config-index -> This scope permits to list all files and folders in the `$CONFIG`folder.", + "type": "string", + "enum": [ + "fs:scope-config-index" + ] + }, + { + "description": "fs:scope-config-recursive -> This scope permits recursive access to the complete `$CONFIG` folder, including sub directories and files.", + "type": "string", + "enum": [ + "fs:scope-config-recursive" + ] + }, + { + "description": "fs:scope-data -> This scope permits access to all files and list content of top level directories in the `$DATA`folder.", + "type": "string", + "enum": [ + "fs:scope-data" + ] + }, + { + "description": "fs:scope-data-index -> This scope permits to list all files and folders in the `$DATA`folder.", + "type": "string", + "enum": [ + "fs:scope-data-index" + ] + }, + { + "description": "fs:scope-data-recursive -> This scope permits recursive access to the complete `$DATA` folder, including sub directories and files.", + "type": "string", + "enum": [ + "fs:scope-data-recursive" + ] + }, + { + "description": "fs:scope-desktop -> This scope permits access to all files and list content of top level directories in the `$DESKTOP`folder.", + "type": "string", + "enum": [ + "fs:scope-desktop" + ] + }, + { + "description": "fs:scope-desktop-index -> This scope permits to list all files and folders in the `$DESKTOP`folder.", + "type": "string", + "enum": [ + "fs:scope-desktop-index" + ] + }, + { + "description": "fs:scope-desktop-recursive -> This scope permits recursive access to the complete `$DESKTOP` folder, including sub directories and files.", + "type": "string", + "enum": [ + "fs:scope-desktop-recursive" + ] + }, + { + "description": "fs:scope-document -> This scope permits access to all files and list content of top level directories in the `$DOCUMENT`folder.", + "type": "string", + "enum": [ + "fs:scope-document" + ] + }, + { + "description": "fs:scope-document-index -> This scope permits to list all files and folders in the `$DOCUMENT`folder.", + "type": "string", + "enum": [ + "fs:scope-document-index" + ] + }, + { + "description": "fs:scope-document-recursive -> This scope permits recursive access to the complete `$DOCUMENT` folder, including sub directories and files.", + "type": "string", + "enum": [ + "fs:scope-document-recursive" + ] + }, + { + "description": "fs:scope-download -> This scope permits access to all files and list content of top level directories in the `$DOWNLOAD`folder.", + "type": "string", + "enum": [ + "fs:scope-download" + ] + }, + { + "description": "fs:scope-download-index -> This scope permits to list all files and folders in the `$DOWNLOAD`folder.", + "type": "string", + "enum": [ + "fs:scope-download-index" + ] + }, + { + "description": "fs:scope-download-recursive -> This scope permits recursive access to the complete `$DOWNLOAD` folder, including sub directories and files.", + "type": "string", + "enum": [ + "fs:scope-download-recursive" + ] + }, + { + "description": "fs:scope-exe -> This scope permits access to all files and list content of top level directories in the `$EXE`folder.", + "type": "string", + "enum": [ + "fs:scope-exe" + ] + }, + { + "description": "fs:scope-exe-index -> This scope permits to list all files and folders in the `$EXE`folder.", + "type": "string", + "enum": [ + "fs:scope-exe-index" + ] + }, + { + "description": "fs:scope-exe-recursive -> This scope permits recursive access to the complete `$EXE` folder, including sub directories and files.", + "type": "string", + "enum": [ + "fs:scope-exe-recursive" + ] + }, + { + "description": "fs:scope-font -> This scope permits access to all files and list content of top level directories in the `$FONT`folder.", + "type": "string", + "enum": [ + "fs:scope-font" + ] + }, + { + "description": "fs:scope-font-index -> This scope permits to list all files and folders in the `$FONT`folder.", + "type": "string", + "enum": [ + "fs:scope-font-index" + ] + }, + { + "description": "fs:scope-font-recursive -> This scope permits recursive access to the complete `$FONT` folder, including sub directories and files.", + "type": "string", + "enum": [ + "fs:scope-font-recursive" + ] + }, + { + "description": "fs:scope-home -> This scope permits access to all files and list content of top level directories in the `$HOME`folder.", + "type": "string", + "enum": [ + "fs:scope-home" + ] + }, + { + "description": "fs:scope-home-index -> This scope permits to list all files and folders in the `$HOME`folder.", + "type": "string", + "enum": [ + "fs:scope-home-index" + ] + }, + { + "description": "fs:scope-home-recursive -> This scope permits recursive access to the complete `$HOME` folder, including sub directories and files.", + "type": "string", + "enum": [ + "fs:scope-home-recursive" + ] + }, + { + "description": "fs:scope-localdata -> This scope permits access to all files and list content of top level directories in the `$LOCALDATA`folder.", + "type": "string", + "enum": [ + "fs:scope-localdata" + ] + }, + { + "description": "fs:scope-localdata-index -> This scope permits to list all files and folders in the `$LOCALDATA`folder.", + "type": "string", + "enum": [ + "fs:scope-localdata-index" + ] + }, + { + "description": "fs:scope-localdata-recursive -> This scope permits recursive access to the complete `$LOCALDATA` folder, including sub directories and files.", + "type": "string", + "enum": [ + "fs:scope-localdata-recursive" + ] + }, + { + "description": "fs:scope-log -> This scope permits access to all files and list content of top level directories in the `$LOG`folder.", + "type": "string", + "enum": [ + "fs:scope-log" + ] + }, + { + "description": "fs:scope-log-index -> This scope permits to list all files and folders in the `$LOG`folder.", + "type": "string", + "enum": [ + "fs:scope-log-index" + ] + }, + { + "description": "fs:scope-log-recursive -> This scope permits recursive access to the complete `$LOG` folder, including sub directories and files.", + "type": "string", + "enum": [ + "fs:scope-log-recursive" + ] + }, + { + "description": "fs:scope-picture -> This scope permits access to all files and list content of top level directories in the `$PICTURE`folder.", + "type": "string", + "enum": [ + "fs:scope-picture" + ] + }, + { + "description": "fs:scope-picture-index -> This scope permits to list all files and folders in the `$PICTURE`folder.", + "type": "string", + "enum": [ + "fs:scope-picture-index" + ] + }, + { + "description": "fs:scope-picture-recursive -> This scope permits recursive access to the complete `$PICTURE` folder, including sub directories and files.", + "type": "string", + "enum": [ + "fs:scope-picture-recursive" + ] + }, + { + "description": "fs:scope-public -> This scope permits access to all files and list content of top level directories in the `$PUBLIC`folder.", + "type": "string", + "enum": [ + "fs:scope-public" + ] + }, + { + "description": "fs:scope-public-index -> This scope permits to list all files and folders in the `$PUBLIC`folder.", + "type": "string", + "enum": [ + "fs:scope-public-index" + ] + }, + { + "description": "fs:scope-public-recursive -> This scope permits recursive access to the complete `$PUBLIC` folder, including sub directories and files.", + "type": "string", + "enum": [ + "fs:scope-public-recursive" + ] + }, + { + "description": "fs:scope-resource -> This scope permits access to all files and list content of top level directories in the `$RESOURCE`folder.", + "type": "string", + "enum": [ + "fs:scope-resource" + ] + }, + { + "description": "fs:scope-resource-index -> This scope permits to list all files and folders in the `$RESOURCE`folder.", + "type": "string", + "enum": [ + "fs:scope-resource-index" + ] + }, + { + "description": "fs:scope-resource-recursive -> This scope permits recursive access to the complete `$RESOURCE` folder, including sub directories and files.", + "type": "string", + "enum": [ + "fs:scope-resource-recursive" + ] + }, + { + "description": "fs:scope-runtime -> This scope permits access to all files and list content of top level directories in the `$RUNTIME`folder.", + "type": "string", + "enum": [ + "fs:scope-runtime" + ] + }, + { + "description": "fs:scope-runtime-index -> This scope permits to list all files and folders in the `$RUNTIME`folder.", + "type": "string", + "enum": [ + "fs:scope-runtime-index" + ] + }, + { + "description": "fs:scope-runtime-recursive -> This scope permits recursive access to the complete `$RUNTIME` folder, including sub directories and files.", + "type": "string", + "enum": [ + "fs:scope-runtime-recursive" + ] + }, + { + "description": "fs:scope-temp -> This scope permits access to all files and list content of top level directories in the `$TEMP`folder.", + "type": "string", + "enum": [ + "fs:scope-temp" + ] + }, + { + "description": "fs:scope-temp-index -> This scope permits to list all files and folders in the `$TEMP`folder.", + "type": "string", + "enum": [ + "fs:scope-temp-index" + ] + }, + { + "description": "fs:scope-temp-recursive -> This scope permits recursive access to the complete `$TEMP` folder, including sub directories and files.", + "type": "string", + "enum": [ + "fs:scope-temp-recursive" + ] + }, + { + "description": "fs:scope-template -> This scope permits access to all files and list content of top level directories in the `$TEMPLATE`folder.", + "type": "string", + "enum": [ + "fs:scope-template" + ] + }, + { + "description": "fs:scope-template-index -> This scope permits to list all files and folders in the `$TEMPLATE`folder.", + "type": "string", + "enum": [ + "fs:scope-template-index" + ] + }, + { + "description": "fs:scope-template-recursive -> This scope permits recursive access to the complete `$TEMPLATE` folder, including sub directories and files.", + "type": "string", + "enum": [ + "fs:scope-template-recursive" + ] + }, + { + "description": "fs:scope-video -> This scope permits access to all files and list content of top level directories in the `$VIDEO`folder.", + "type": "string", + "enum": [ + "fs:scope-video" + ] + }, + { + "description": "fs:scope-video-index -> This scope permits to list all files and folders in the `$VIDEO`folder.", + "type": "string", + "enum": [ + "fs:scope-video-index" + ] + }, + { + "description": "fs:scope-video-recursive -> This scope permits recursive access to the complete `$VIDEO` folder, including sub directories and files.", + "type": "string", + "enum": [ + "fs:scope-video-recursive" + ] + }, + { + "description": "fs:write-all -> This enables all write related commands without any pre-configured accessible paths.", + "type": "string", + "enum": [ + "fs:write-all" + ] + }, + { + "description": "fs:write-files -> This enables all file write related commands without any pre-configured accessible paths.", + "type": "string", + "enum": [ + "fs:write-files" + ] + } + ] + }, + "allow": { + "items": { + "title": "FsScopeEntry", + "description": "FS scope entry.", + "anyOf": [ + { + "description": "FS scope path.", + "type": "string" + }, + { + "type": "object", + "required": [ + "path" + ], + "properties": { + "path": { + "description": "FS scope path.", + "type": "string" + } + } + } + ] + } + }, + "deny": { + "items": { + "title": "FsScopeEntry", + "description": "FS scope entry.", + "anyOf": [ + { + "description": "FS scope path.", + "type": "string" + }, + { + "type": "object", + "required": [ + "path" + ], + "properties": { + "path": { + "description": "FS scope path.", + "type": "string" + } + } + } + ] + } + } + } + }, + { + "type": "object", + "required": [ + "identifier" + ], + "properties": { + "identifier": { + "oneOf": [ + { + "description": "shell:default -> This permission set configures which\nshell functionality is exposed by default.\n\n#### Granted Permissions\n\nIt allows to use the `open` functionality without any specific\nscope pre-configured. It will allow opening `http(s)://`,\n`tel:` and `mailto:` links.\n", + "type": "string", + "enum": [ + "shell:default" + ] + }, + { + "description": "shell:allow-execute -> Enables the execute command without any pre-configured scope.", + "type": "string", + "enum": [ + "shell:allow-execute" + ] + }, + { + "description": "shell:allow-kill -> Enables the kill command without any pre-configured scope.", + "type": "string", + "enum": [ + "shell:allow-kill" + ] + }, + { + "description": "shell:allow-open -> Enables the open command without any pre-configured scope.", + "type": "string", + "enum": [ + "shell:allow-open" + ] + }, + { + "description": "shell:allow-spawn -> Enables the spawn command without any pre-configured scope.", + "type": "string", + "enum": [ + "shell:allow-spawn" + ] + }, + { + "description": "shell:allow-stdin-write -> Enables the stdin_write command without any pre-configured scope.", + "type": "string", + "enum": [ + "shell:allow-stdin-write" + ] + }, + { + "description": "shell:deny-execute -> Denies the execute command without any pre-configured scope.", + "type": "string", + "enum": [ + "shell:deny-execute" + ] + }, + { + "description": "shell:deny-kill -> Denies the kill command without any pre-configured scope.", + "type": "string", + "enum": [ + "shell:deny-kill" + ] + }, + { + "description": "shell:deny-open -> Denies the open command without any pre-configured scope.", + "type": "string", + "enum": [ + "shell:deny-open" + ] + }, + { + "description": "shell:deny-spawn -> Denies the spawn command without any pre-configured scope.", + "type": "string", + "enum": [ + "shell:deny-spawn" + ] + }, + { + "description": "shell:deny-stdin-write -> Denies the stdin_write command without any pre-configured scope.", + "type": "string", + "enum": [ + "shell:deny-stdin-write" + ] + } + ] + }, + "allow": { + "items": { + "title": "Entry", + "description": "A command allowed to be executed by the webview API.", + "type": "object", + "required": [ + "args", + "cmd", + "name", + "sidecar" + ], + "properties": { + "args": { + "description": "The allowed arguments for the command execution.", + "allOf": [ + { + "$ref": "#/definitions/ShellAllowedArgs" + } + ] + }, + "cmd": { + "description": "The command name. It can start with a variable that resolves to a system base directory. The variables are: `$AUDIO`, `$CACHE`, `$CONFIG`, `$DATA`, `$LOCALDATA`, `$DESKTOP`, `$DOCUMENT`, `$DOWNLOAD`, `$EXE`, `$FONT`, `$HOME`, `$PICTURE`, `$PUBLIC`, `$RUNTIME`, `$TEMPLATE`, `$VIDEO`, `$RESOURCE`, `$APP`, `$LOG`, `$TEMP`, `$APPCONFIG`, `$APPDATA`, `$APPLOCALDATA`, `$APPCACHE`, `$APPLOG`.", + "type": "string" + }, + "name": { + "description": "The name for this allowed shell command configuration.\n\nThis name will be used inside of the webview API to call this command along with any specified arguments.", + "type": "string" + }, + "sidecar": { + "description": "If this command is a sidecar command.", + "type": "boolean" + } + } + } + }, + "deny": { + "items": { + "title": "Entry", + "description": "A command allowed to be executed by the webview API.", + "type": "object", + "required": [ + "args", + "cmd", + "name", + "sidecar" + ], + "properties": { + "args": { + "description": "The allowed arguments for the command execution.", + "allOf": [ + { + "$ref": "#/definitions/ShellAllowedArgs" + } + ] + }, + "cmd": { + "description": "The command name. It can start with a variable that resolves to a system base directory. The variables are: `$AUDIO`, `$CACHE`, `$CONFIG`, `$DATA`, `$LOCALDATA`, `$DESKTOP`, `$DOCUMENT`, `$DOWNLOAD`, `$EXE`, `$FONT`, `$HOME`, `$PICTURE`, `$PUBLIC`, `$RUNTIME`, `$TEMPLATE`, `$VIDEO`, `$RESOURCE`, `$APP`, `$LOG`, `$TEMP`, `$APPCONFIG`, `$APPDATA`, `$APPLOCALDATA`, `$APPCACHE`, `$APPLOG`.", + "type": "string" + }, + "name": { + "description": "The name for this allowed shell command configuration.\n\nThis name will be used inside of the webview API to call this command along with any specified arguments.", + "type": "string" + }, + "sidecar": { + "description": "If this command is a sidecar command.", + "type": "boolean" + } + } + } + } + } + } + ] + } + ] + }, + "Identifier": { + "oneOf": [ + { + "description": "clipboard-manager:default -> No features are enabled by default, as we believe\nthe clipboard can be inherently dangerous and it is \napplication specific if read and/or write access is needed.\n\nClipboard interaction needs to be explicitly enabled.\n", + "type": "string", + "enum": [ + "clipboard-manager:default" + ] + }, + { + "description": "clipboard-manager:allow-clear -> Enables the clear command without any pre-configured scope.", + "type": "string", + "enum": [ + "clipboard-manager:allow-clear" + ] + }, + { + "description": "clipboard-manager:allow-read-image -> Enables the read_image command without any pre-configured scope.", + "type": "string", + "enum": [ + "clipboard-manager:allow-read-image" + ] + }, + { + "description": "clipboard-manager:allow-read-text -> Enables the read_text command without any pre-configured scope.", + "type": "string", + "enum": [ + "clipboard-manager:allow-read-text" + ] + }, + { + "description": "clipboard-manager:allow-write-html -> Enables the write_html command without any pre-configured scope.", + "type": "string", + "enum": [ + "clipboard-manager:allow-write-html" + ] + }, + { + "description": "clipboard-manager:allow-write-image -> Enables the write_image command without any pre-configured scope.", + "type": "string", + "enum": [ + "clipboard-manager:allow-write-image" + ] + }, + { + "description": "clipboard-manager:allow-write-text -> Enables the write_text command without any pre-configured scope.", + "type": "string", + "enum": [ + "clipboard-manager:allow-write-text" + ] + }, + { + "description": "clipboard-manager:deny-clear -> Denies the clear command without any pre-configured scope.", + "type": "string", + "enum": [ + "clipboard-manager:deny-clear" + ] + }, + { + "description": "clipboard-manager:deny-read-image -> Denies the read_image command without any pre-configured scope.", + "type": "string", + "enum": [ + "clipboard-manager:deny-read-image" + ] + }, + { + "description": "clipboard-manager:deny-read-text -> Denies the read_text command without any pre-configured scope.", + "type": "string", + "enum": [ + "clipboard-manager:deny-read-text" + ] + }, + { + "description": "clipboard-manager:deny-write-html -> Denies the write_html command without any pre-configured scope.", + "type": "string", + "enum": [ + "clipboard-manager:deny-write-html" + ] + }, + { + "description": "clipboard-manager:deny-write-image -> Denies the write_image command without any pre-configured scope.", + "type": "string", + "enum": [ + "clipboard-manager:deny-write-image" + ] + }, + { + "description": "clipboard-manager:deny-write-text -> Denies the write_text command without any pre-configured scope.", + "type": "string", + "enum": [ + "clipboard-manager:deny-write-text" + ] + }, + { + "description": "core:app:default -> Default permissions for the plugin.", + "type": "string", + "enum": [ + "core:app:default" + ] + }, + { + "description": "core:app:allow-app-hide -> Enables the app_hide command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:app:allow-app-hide" + ] + }, + { + "description": "core:app:allow-app-show -> Enables the app_show command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:app:allow-app-show" + ] + }, + { + "description": "core:app:allow-default-window-icon -> Enables the default_window_icon command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:app:allow-default-window-icon" + ] + }, + { + "description": "core:app:allow-name -> Enables the name command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:app:allow-name" + ] + }, + { + "description": "core:app:allow-tauri-version -> Enables the tauri_version command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:app:allow-tauri-version" + ] + }, + { + "description": "core:app:allow-version -> Enables the version command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:app:allow-version" + ] + }, + { + "description": "core:app:deny-app-hide -> Denies the app_hide command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:app:deny-app-hide" + ] + }, + { + "description": "core:app:deny-app-show -> Denies the app_show command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:app:deny-app-show" + ] + }, + { + "description": "core:app:deny-default-window-icon -> Denies the default_window_icon command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:app:deny-default-window-icon" + ] + }, + { + "description": "core:app:deny-name -> Denies the name command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:app:deny-name" + ] + }, + { + "description": "core:app:deny-tauri-version -> Denies the tauri_version command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:app:deny-tauri-version" + ] + }, + { + "description": "core:app:deny-version -> Denies the version command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:app:deny-version" + ] + }, + { + "description": "core:event:default -> Default permissions for the plugin.", + "type": "string", + "enum": [ + "core:event:default" + ] + }, + { + "description": "core:event:allow-emit -> Enables the emit command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:event:allow-emit" + ] + }, + { + "description": "core:event:allow-emit-to -> Enables the emit_to command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:event:allow-emit-to" + ] + }, + { + "description": "core:event:allow-listen -> Enables the listen command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:event:allow-listen" + ] + }, + { + "description": "core:event:allow-unlisten -> Enables the unlisten command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:event:allow-unlisten" + ] + }, + { + "description": "core:event:deny-emit -> Denies the emit command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:event:deny-emit" + ] + }, + { + "description": "core:event:deny-emit-to -> Denies the emit_to command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:event:deny-emit-to" + ] + }, + { + "description": "core:event:deny-listen -> Denies the listen command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:event:deny-listen" + ] + }, + { + "description": "core:event:deny-unlisten -> Denies the unlisten command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:event:deny-unlisten" + ] + }, + { + "description": "core:image:default -> Default permissions for the plugin.", + "type": "string", + "enum": [ + "core:image:default" + ] + }, + { + "description": "core:image:allow-from-bytes -> Enables the from_bytes command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:image:allow-from-bytes" + ] + }, + { + "description": "core:image:allow-from-path -> Enables the from_path command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:image:allow-from-path" + ] + }, + { + "description": "core:image:allow-new -> Enables the new command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:image:allow-new" + ] + }, + { + "description": "core:image:allow-rgba -> Enables the rgba command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:image:allow-rgba" + ] + }, + { + "description": "core:image:allow-size -> Enables the size command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:image:allow-size" + ] + }, + { + "description": "core:image:deny-from-bytes -> Denies the from_bytes command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:image:deny-from-bytes" + ] + }, + { + "description": "core:image:deny-from-path -> Denies the from_path command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:image:deny-from-path" + ] + }, + { + "description": "core:image:deny-new -> Denies the new command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:image:deny-new" + ] + }, + { + "description": "core:image:deny-rgba -> Denies the rgba command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:image:deny-rgba" + ] + }, + { + "description": "core:image:deny-size -> Denies the size command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:image:deny-size" + ] + }, + { + "description": "core:menu:default -> Default permissions for the plugin.", + "type": "string", + "enum": [ + "core:menu:default" + ] + }, + { + "description": "core:menu:allow-append -> Enables the append command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:menu:allow-append" + ] + }, + { + "description": "core:menu:allow-create-default -> Enables the create_default command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:menu:allow-create-default" + ] + }, + { + "description": "core:menu:allow-get -> Enables the get command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:menu:allow-get" + ] + }, + { + "description": "core:menu:allow-insert -> Enables the insert command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:menu:allow-insert" + ] + }, + { + "description": "core:menu:allow-is-checked -> Enables the is_checked command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:menu:allow-is-checked" + ] + }, + { + "description": "core:menu:allow-is-enabled -> Enables the is_enabled command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:menu:allow-is-enabled" + ] + }, + { + "description": "core:menu:allow-items -> Enables the items command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:menu:allow-items" + ] + }, + { + "description": "core:menu:allow-new -> Enables the new command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:menu:allow-new" + ] + }, + { + "description": "core:menu:allow-popup -> Enables the popup command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:menu:allow-popup" + ] + }, + { + "description": "core:menu:allow-prepend -> Enables the prepend command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:menu:allow-prepend" + ] + }, + { + "description": "core:menu:allow-remove -> Enables the remove command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:menu:allow-remove" + ] + }, + { + "description": "core:menu:allow-remove-at -> Enables the remove_at command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:menu:allow-remove-at" + ] + }, + { + "description": "core:menu:allow-set-accelerator -> Enables the set_accelerator command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:menu:allow-set-accelerator" + ] + }, + { + "description": "core:menu:allow-set-as-app-menu -> Enables the set_as_app_menu command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:menu:allow-set-as-app-menu" + ] + }, + { + "description": "core:menu:allow-set-as-help-menu-for-nsapp -> Enables the set_as_help_menu_for_nsapp command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:menu:allow-set-as-help-menu-for-nsapp" + ] + }, + { + "description": "core:menu:allow-set-as-window-menu -> Enables the set_as_window_menu command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:menu:allow-set-as-window-menu" + ] + }, + { + "description": "core:menu:allow-set-as-windows-menu-for-nsapp -> Enables the set_as_windows_menu_for_nsapp command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:menu:allow-set-as-windows-menu-for-nsapp" + ] + }, + { + "description": "core:menu:allow-set-checked -> Enables the set_checked command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:menu:allow-set-checked" + ] + }, + { + "description": "core:menu:allow-set-enabled -> Enables the set_enabled command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:menu:allow-set-enabled" + ] + }, + { + "description": "core:menu:allow-set-icon -> Enables the set_icon command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:menu:allow-set-icon" + ] + }, + { + "description": "core:menu:allow-set-text -> Enables the set_text command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:menu:allow-set-text" + ] + }, + { + "description": "core:menu:allow-text -> Enables the text command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:menu:allow-text" + ] + }, + { + "description": "core:menu:deny-append -> Denies the append command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:menu:deny-append" + ] + }, + { + "description": "core:menu:deny-create-default -> Denies the create_default command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:menu:deny-create-default" + ] + }, + { + "description": "core:menu:deny-get -> Denies the get command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:menu:deny-get" + ] + }, + { + "description": "core:menu:deny-insert -> Denies the insert command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:menu:deny-insert" + ] + }, + { + "description": "core:menu:deny-is-checked -> Denies the is_checked command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:menu:deny-is-checked" + ] + }, + { + "description": "core:menu:deny-is-enabled -> Denies the is_enabled command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:menu:deny-is-enabled" + ] + }, + { + "description": "core:menu:deny-items -> Denies the items command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:menu:deny-items" + ] + }, + { + "description": "core:menu:deny-new -> Denies the new command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:menu:deny-new" + ] + }, + { + "description": "core:menu:deny-popup -> Denies the popup command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:menu:deny-popup" + ] + }, + { + "description": "core:menu:deny-prepend -> Denies the prepend command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:menu:deny-prepend" + ] + }, + { + "description": "core:menu:deny-remove -> Denies the remove command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:menu:deny-remove" + ] + }, + { + "description": "core:menu:deny-remove-at -> Denies the remove_at command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:menu:deny-remove-at" + ] + }, + { + "description": "core:menu:deny-set-accelerator -> Denies the set_accelerator command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:menu:deny-set-accelerator" + ] + }, + { + "description": "core:menu:deny-set-as-app-menu -> Denies the set_as_app_menu command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:menu:deny-set-as-app-menu" + ] + }, + { + "description": "core:menu:deny-set-as-help-menu-for-nsapp -> Denies the set_as_help_menu_for_nsapp command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:menu:deny-set-as-help-menu-for-nsapp" + ] + }, + { + "description": "core:menu:deny-set-as-window-menu -> Denies the set_as_window_menu command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:menu:deny-set-as-window-menu" + ] + }, + { + "description": "core:menu:deny-set-as-windows-menu-for-nsapp -> Denies the set_as_windows_menu_for_nsapp command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:menu:deny-set-as-windows-menu-for-nsapp" + ] + }, + { + "description": "core:menu:deny-set-checked -> Denies the set_checked command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:menu:deny-set-checked" + ] + }, + { + "description": "core:menu:deny-set-enabled -> Denies the set_enabled command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:menu:deny-set-enabled" + ] + }, + { + "description": "core:menu:deny-set-icon -> Denies the set_icon command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:menu:deny-set-icon" + ] + }, + { + "description": "core:menu:deny-set-text -> Denies the set_text command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:menu:deny-set-text" + ] + }, + { + "description": "core:menu:deny-text -> Denies the text command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:menu:deny-text" + ] + }, + { + "description": "core:path:default -> Default permissions for the plugin.", + "type": "string", + "enum": [ + "core:path:default" + ] + }, + { + "description": "core:path:allow-basename -> Enables the basename command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:path:allow-basename" + ] + }, + { + "description": "core:path:allow-dirname -> Enables the dirname command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:path:allow-dirname" + ] + }, + { + "description": "core:path:allow-extname -> Enables the extname command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:path:allow-extname" + ] + }, + { + "description": "core:path:allow-is-absolute -> Enables the is_absolute command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:path:allow-is-absolute" + ] + }, + { + "description": "core:path:allow-join -> Enables the join command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:path:allow-join" + ] + }, + { + "description": "core:path:allow-normalize -> Enables the normalize command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:path:allow-normalize" + ] + }, + { + "description": "core:path:allow-resolve -> Enables the resolve command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:path:allow-resolve" + ] + }, + { + "description": "core:path:allow-resolve-directory -> Enables the resolve_directory command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:path:allow-resolve-directory" + ] + }, + { + "description": "core:path:deny-basename -> Denies the basename command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:path:deny-basename" + ] + }, + { + "description": "core:path:deny-dirname -> Denies the dirname command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:path:deny-dirname" + ] + }, + { + "description": "core:path:deny-extname -> Denies the extname command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:path:deny-extname" + ] + }, + { + "description": "core:path:deny-is-absolute -> Denies the is_absolute command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:path:deny-is-absolute" + ] + }, + { + "description": "core:path:deny-join -> Denies the join command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:path:deny-join" + ] + }, + { + "description": "core:path:deny-normalize -> Denies the normalize command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:path:deny-normalize" + ] + }, + { + "description": "core:path:deny-resolve -> Denies the resolve command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:path:deny-resolve" + ] + }, + { + "description": "core:path:deny-resolve-directory -> Denies the resolve_directory command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:path:deny-resolve-directory" + ] + }, + { + "description": "core:resources:default -> Default permissions for the plugin.", + "type": "string", + "enum": [ + "core:resources:default" + ] + }, + { + "description": "core:resources:allow-close -> Enables the close command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:resources:allow-close" + ] + }, + { + "description": "core:resources:deny-close -> Denies the close command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:resources:deny-close" + ] + }, + { + "description": "core:tray:default -> Default permissions for the plugin.", + "type": "string", + "enum": [ + "core:tray:default" + ] + }, + { + "description": "core:tray:allow-get-by-id -> Enables the get_by_id command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:tray:allow-get-by-id" + ] + }, + { + "description": "core:tray:allow-new -> Enables the new command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:tray:allow-new" + ] + }, + { + "description": "core:tray:allow-remove-by-id -> Enables the remove_by_id command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:tray:allow-remove-by-id" + ] + }, + { + "description": "core:tray:allow-set-icon -> Enables the set_icon command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:tray:allow-set-icon" + ] + }, + { + "description": "core:tray:allow-set-icon-as-template -> Enables the set_icon_as_template command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:tray:allow-set-icon-as-template" + ] + }, + { + "description": "core:tray:allow-set-menu -> Enables the set_menu command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:tray:allow-set-menu" + ] + }, + { + "description": "core:tray:allow-set-show-menu-on-left-click -> Enables the set_show_menu_on_left_click command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:tray:allow-set-show-menu-on-left-click" + ] + }, + { + "description": "core:tray:allow-set-temp-dir-path -> Enables the set_temp_dir_path command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:tray:allow-set-temp-dir-path" + ] + }, + { + "description": "core:tray:allow-set-title -> Enables the set_title command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:tray:allow-set-title" + ] + }, + { + "description": "core:tray:allow-set-tooltip -> Enables the set_tooltip command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:tray:allow-set-tooltip" + ] + }, + { + "description": "core:tray:allow-set-visible -> Enables the set_visible command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:tray:allow-set-visible" + ] + }, + { + "description": "core:tray:deny-get-by-id -> Denies the get_by_id command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:tray:deny-get-by-id" + ] + }, + { + "description": "core:tray:deny-new -> Denies the new command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:tray:deny-new" + ] + }, + { + "description": "core:tray:deny-remove-by-id -> Denies the remove_by_id command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:tray:deny-remove-by-id" + ] + }, + { + "description": "core:tray:deny-set-icon -> Denies the set_icon command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:tray:deny-set-icon" + ] + }, + { + "description": "core:tray:deny-set-icon-as-template -> Denies the set_icon_as_template command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:tray:deny-set-icon-as-template" + ] + }, + { + "description": "core:tray:deny-set-menu -> Denies the set_menu command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:tray:deny-set-menu" + ] + }, + { + "description": "core:tray:deny-set-show-menu-on-left-click -> Denies the set_show_menu_on_left_click command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:tray:deny-set-show-menu-on-left-click" + ] + }, + { + "description": "core:tray:deny-set-temp-dir-path -> Denies the set_temp_dir_path command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:tray:deny-set-temp-dir-path" + ] + }, + { + "description": "core:tray:deny-set-title -> Denies the set_title command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:tray:deny-set-title" + ] + }, + { + "description": "core:tray:deny-set-tooltip -> Denies the set_tooltip command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:tray:deny-set-tooltip" + ] + }, + { + "description": "core:tray:deny-set-visible -> Denies the set_visible command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:tray:deny-set-visible" + ] + }, + { + "description": "core:webview:default -> Default permissions for the plugin.", + "type": "string", + "enum": [ + "core:webview:default" + ] + }, + { + "description": "core:webview:allow-create-webview -> Enables the create_webview command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:webview:allow-create-webview" + ] + }, + { + "description": "core:webview:allow-create-webview-window -> Enables the create_webview_window command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:webview:allow-create-webview-window" + ] + }, + { + "description": "core:webview:allow-get-all-webviews -> Enables the get_all_webviews command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:webview:allow-get-all-webviews" + ] + }, + { + "description": "core:webview:allow-internal-toggle-devtools -> Enables the internal_toggle_devtools command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:webview:allow-internal-toggle-devtools" + ] + }, + { + "description": "core:webview:allow-print -> Enables the print command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:webview:allow-print" + ] + }, + { + "description": "core:webview:allow-reparent -> Enables the reparent command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:webview:allow-reparent" + ] + }, + { + "description": "core:webview:allow-set-webview-focus -> Enables the set_webview_focus command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:webview:allow-set-webview-focus" + ] + }, + { + "description": "core:webview:allow-set-webview-position -> Enables the set_webview_position command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:webview:allow-set-webview-position" + ] + }, + { + "description": "core:webview:allow-set-webview-size -> Enables the set_webview_size command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:webview:allow-set-webview-size" + ] + }, + { + "description": "core:webview:allow-set-webview-zoom -> Enables the set_webview_zoom command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:webview:allow-set-webview-zoom" + ] + }, + { + "description": "core:webview:allow-webview-close -> Enables the webview_close command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:webview:allow-webview-close" + ] + }, + { + "description": "core:webview:allow-webview-position -> Enables the webview_position command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:webview:allow-webview-position" + ] + }, + { + "description": "core:webview:allow-webview-size -> Enables the webview_size command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:webview:allow-webview-size" + ] + }, + { + "description": "core:webview:deny-create-webview -> Denies the create_webview command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:webview:deny-create-webview" + ] + }, + { + "description": "core:webview:deny-create-webview-window -> Denies the create_webview_window command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:webview:deny-create-webview-window" + ] + }, + { + "description": "core:webview:deny-get-all-webviews -> Denies the get_all_webviews command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:webview:deny-get-all-webviews" + ] + }, + { + "description": "core:webview:deny-internal-toggle-devtools -> Denies the internal_toggle_devtools command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:webview:deny-internal-toggle-devtools" + ] + }, + { + "description": "core:webview:deny-print -> Denies the print command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:webview:deny-print" + ] + }, + { + "description": "core:webview:deny-reparent -> Denies the reparent command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:webview:deny-reparent" + ] + }, + { + "description": "core:webview:deny-set-webview-focus -> Denies the set_webview_focus command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:webview:deny-set-webview-focus" + ] + }, + { + "description": "core:webview:deny-set-webview-position -> Denies the set_webview_position command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:webview:deny-set-webview-position" + ] + }, + { + "description": "core:webview:deny-set-webview-size -> Denies the set_webview_size command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:webview:deny-set-webview-size" + ] + }, + { + "description": "core:webview:deny-set-webview-zoom -> Denies the set_webview_zoom command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:webview:deny-set-webview-zoom" + ] + }, + { + "description": "core:webview:deny-webview-close -> Denies the webview_close command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:webview:deny-webview-close" + ] + }, + { + "description": "core:webview:deny-webview-position -> Denies the webview_position command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:webview:deny-webview-position" + ] + }, + { + "description": "core:webview:deny-webview-size -> Denies the webview_size command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:webview:deny-webview-size" + ] + }, + { + "description": "core:window:default -> Default permissions for the plugin.", + "type": "string", + "enum": [ + "core:window:default" + ] + }, + { + "description": "core:window:allow-available-monitors -> Enables the available_monitors command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:allow-available-monitors" + ] + }, + { + "description": "core:window:allow-center -> Enables the center command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:allow-center" + ] + }, + { + "description": "core:window:allow-close -> Enables the close command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:allow-close" + ] + }, + { + "description": "core:window:allow-create -> Enables the create command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:allow-create" + ] + }, + { + "description": "core:window:allow-current-monitor -> Enables the current_monitor command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:allow-current-monitor" + ] + }, + { + "description": "core:window:allow-cursor-position -> Enables the cursor_position command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:allow-cursor-position" + ] + }, + { + "description": "core:window:allow-destroy -> Enables the destroy command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:allow-destroy" + ] + }, + { + "description": "core:window:allow-get-all-windows -> Enables the get_all_windows command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:allow-get-all-windows" + ] + }, + { + "description": "core:window:allow-hide -> Enables the hide command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:allow-hide" + ] + }, + { + "description": "core:window:allow-inner-position -> Enables the inner_position command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:allow-inner-position" + ] + }, + { + "description": "core:window:allow-inner-size -> Enables the inner_size command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:allow-inner-size" + ] + }, + { + "description": "core:window:allow-internal-toggle-maximize -> Enables the internal_toggle_maximize command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:allow-internal-toggle-maximize" + ] + }, + { + "description": "core:window:allow-is-closable -> Enables the is_closable command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:allow-is-closable" + ] + }, + { + "description": "core:window:allow-is-decorated -> Enables the is_decorated command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:allow-is-decorated" + ] + }, + { + "description": "core:window:allow-is-focused -> Enables the is_focused command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:allow-is-focused" + ] + }, + { + "description": "core:window:allow-is-fullscreen -> Enables the is_fullscreen command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:allow-is-fullscreen" + ] + }, + { + "description": "core:window:allow-is-maximizable -> Enables the is_maximizable command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:allow-is-maximizable" + ] + }, + { + "description": "core:window:allow-is-maximized -> Enables the is_maximized command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:allow-is-maximized" + ] + }, + { + "description": "core:window:allow-is-minimizable -> Enables the is_minimizable command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:allow-is-minimizable" + ] + }, + { + "description": "core:window:allow-is-minimized -> Enables the is_minimized command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:allow-is-minimized" + ] + }, + { + "description": "core:window:allow-is-resizable -> Enables the is_resizable command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:allow-is-resizable" + ] + }, + { + "description": "core:window:allow-is-visible -> Enables the is_visible command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:allow-is-visible" + ] + }, + { + "description": "core:window:allow-maximize -> Enables the maximize command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:allow-maximize" + ] + }, + { + "description": "core:window:allow-minimize -> Enables the minimize command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:allow-minimize" + ] + }, + { + "description": "core:window:allow-monitor-from-point -> Enables the monitor_from_point command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:allow-monitor-from-point" + ] + }, + { + "description": "core:window:allow-outer-position -> Enables the outer_position command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:allow-outer-position" + ] + }, + { + "description": "core:window:allow-outer-size -> Enables the outer_size command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:allow-outer-size" + ] + }, + { + "description": "core:window:allow-primary-monitor -> Enables the primary_monitor command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:allow-primary-monitor" + ] + }, + { + "description": "core:window:allow-request-user-attention -> Enables the request_user_attention command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:allow-request-user-attention" + ] + }, + { + "description": "core:window:allow-scale-factor -> Enables the scale_factor command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:allow-scale-factor" + ] + }, + { + "description": "core:window:allow-set-always-on-bottom -> Enables the set_always_on_bottom command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:allow-set-always-on-bottom" + ] + }, + { + "description": "core:window:allow-set-always-on-top -> Enables the set_always_on_top command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:allow-set-always-on-top" + ] + }, + { + "description": "core:window:allow-set-closable -> Enables the set_closable command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:allow-set-closable" + ] + }, + { + "description": "core:window:allow-set-content-protected -> Enables the set_content_protected command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:allow-set-content-protected" + ] + }, + { + "description": "core:window:allow-set-cursor-grab -> Enables the set_cursor_grab command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:allow-set-cursor-grab" + ] + }, + { + "description": "core:window:allow-set-cursor-icon -> Enables the set_cursor_icon command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:allow-set-cursor-icon" + ] + }, + { + "description": "core:window:allow-set-cursor-position -> Enables the set_cursor_position command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:allow-set-cursor-position" + ] + }, + { + "description": "core:window:allow-set-cursor-visible -> Enables the set_cursor_visible command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:allow-set-cursor-visible" + ] + }, + { + "description": "core:window:allow-set-decorations -> Enables the set_decorations command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:allow-set-decorations" + ] + }, + { + "description": "core:window:allow-set-effects -> Enables the set_effects command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:allow-set-effects" + ] + }, + { + "description": "core:window:allow-set-focus -> Enables the set_focus command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:allow-set-focus" + ] + }, + { + "description": "core:window:allow-set-fullscreen -> Enables the set_fullscreen command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:allow-set-fullscreen" + ] + }, + { + "description": "core:window:allow-set-icon -> Enables the set_icon command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:allow-set-icon" + ] + }, + { + "description": "core:window:allow-set-ignore-cursor-events -> Enables the set_ignore_cursor_events command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:allow-set-ignore-cursor-events" + ] + }, + { + "description": "core:window:allow-set-max-size -> Enables the set_max_size command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:allow-set-max-size" + ] + }, + { + "description": "core:window:allow-set-maximizable -> Enables the set_maximizable command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:allow-set-maximizable" + ] + }, + { + "description": "core:window:allow-set-min-size -> Enables the set_min_size command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:allow-set-min-size" + ] + }, + { + "description": "core:window:allow-set-minimizable -> Enables the set_minimizable command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:allow-set-minimizable" + ] + }, + { + "description": "core:window:allow-set-position -> Enables the set_position command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:allow-set-position" + ] + }, + { + "description": "core:window:allow-set-progress-bar -> Enables the set_progress_bar command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:allow-set-progress-bar" + ] + }, + { + "description": "core:window:allow-set-resizable -> Enables the set_resizable command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:allow-set-resizable" + ] + }, + { + "description": "core:window:allow-set-shadow -> Enables the set_shadow command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:allow-set-shadow" + ] + }, + { + "description": "core:window:allow-set-size -> Enables the set_size command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:allow-set-size" + ] + }, + { + "description": "core:window:allow-set-size-constraints -> Enables the set_size_constraints command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:allow-set-size-constraints" + ] + }, + { + "description": "core:window:allow-set-skip-taskbar -> Enables the set_skip_taskbar command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:allow-set-skip-taskbar" + ] + }, + { + "description": "core:window:allow-set-title -> Enables the set_title command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:allow-set-title" + ] + }, + { + "description": "core:window:allow-set-title-bar-style -> Enables the set_title_bar_style command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:allow-set-title-bar-style" + ] + }, + { + "description": "core:window:allow-set-visible-on-all-workspaces -> Enables the set_visible_on_all_workspaces command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:allow-set-visible-on-all-workspaces" + ] + }, + { + "description": "core:window:allow-show -> Enables the show command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:allow-show" + ] + }, + { + "description": "core:window:allow-start-dragging -> Enables the start_dragging command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:allow-start-dragging" + ] + }, + { + "description": "core:window:allow-start-resize-dragging -> Enables the start_resize_dragging command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:allow-start-resize-dragging" + ] + }, + { + "description": "core:window:allow-theme -> Enables the theme command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:allow-theme" + ] + }, + { + "description": "core:window:allow-title -> Enables the title command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:allow-title" + ] + }, + { + "description": "core:window:allow-toggle-maximize -> Enables the toggle_maximize command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:allow-toggle-maximize" + ] + }, + { + "description": "core:window:allow-unmaximize -> Enables the unmaximize command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:allow-unmaximize" + ] + }, + { + "description": "core:window:allow-unminimize -> Enables the unminimize command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:allow-unminimize" + ] + }, + { + "description": "core:window:deny-available-monitors -> Denies the available_monitors command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:deny-available-monitors" + ] + }, + { + "description": "core:window:deny-center -> Denies the center command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:deny-center" + ] + }, + { + "description": "core:window:deny-close -> Denies the close command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:deny-close" + ] + }, + { + "description": "core:window:deny-create -> Denies the create command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:deny-create" + ] + }, + { + "description": "core:window:deny-current-monitor -> Denies the current_monitor command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:deny-current-monitor" + ] + }, + { + "description": "core:window:deny-cursor-position -> Denies the cursor_position command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:deny-cursor-position" + ] + }, + { + "description": "core:window:deny-destroy -> Denies the destroy command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:deny-destroy" + ] + }, + { + "description": "core:window:deny-get-all-windows -> Denies the get_all_windows command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:deny-get-all-windows" + ] + }, + { + "description": "core:window:deny-hide -> Denies the hide command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:deny-hide" + ] + }, + { + "description": "core:window:deny-inner-position -> Denies the inner_position command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:deny-inner-position" + ] + }, + { + "description": "core:window:deny-inner-size -> Denies the inner_size command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:deny-inner-size" + ] + }, + { + "description": "core:window:deny-internal-toggle-maximize -> Denies the internal_toggle_maximize command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:deny-internal-toggle-maximize" + ] + }, + { + "description": "core:window:deny-is-closable -> Denies the is_closable command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:deny-is-closable" + ] + }, + { + "description": "core:window:deny-is-decorated -> Denies the is_decorated command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:deny-is-decorated" + ] + }, + { + "description": "core:window:deny-is-focused -> Denies the is_focused command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:deny-is-focused" + ] + }, + { + "description": "core:window:deny-is-fullscreen -> Denies the is_fullscreen command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:deny-is-fullscreen" + ] + }, + { + "description": "core:window:deny-is-maximizable -> Denies the is_maximizable command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:deny-is-maximizable" + ] + }, + { + "description": "core:window:deny-is-maximized -> Denies the is_maximized command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:deny-is-maximized" + ] + }, + { + "description": "core:window:deny-is-minimizable -> Denies the is_minimizable command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:deny-is-minimizable" + ] + }, + { + "description": "core:window:deny-is-minimized -> Denies the is_minimized command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:deny-is-minimized" + ] + }, + { + "description": "core:window:deny-is-resizable -> Denies the is_resizable command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:deny-is-resizable" + ] + }, + { + "description": "core:window:deny-is-visible -> Denies the is_visible command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:deny-is-visible" + ] + }, + { + "description": "core:window:deny-maximize -> Denies the maximize command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:deny-maximize" + ] + }, + { + "description": "core:window:deny-minimize -> Denies the minimize command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:deny-minimize" + ] + }, + { + "description": "core:window:deny-monitor-from-point -> Denies the monitor_from_point command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:deny-monitor-from-point" + ] + }, + { + "description": "core:window:deny-outer-position -> Denies the outer_position command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:deny-outer-position" + ] + }, + { + "description": "core:window:deny-outer-size -> Denies the outer_size command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:deny-outer-size" + ] + }, + { + "description": "core:window:deny-primary-monitor -> Denies the primary_monitor command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:deny-primary-monitor" + ] + }, + { + "description": "core:window:deny-request-user-attention -> Denies the request_user_attention command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:deny-request-user-attention" + ] + }, + { + "description": "core:window:deny-scale-factor -> Denies the scale_factor command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:deny-scale-factor" + ] + }, + { + "description": "core:window:deny-set-always-on-bottom -> Denies the set_always_on_bottom command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:deny-set-always-on-bottom" + ] + }, + { + "description": "core:window:deny-set-always-on-top -> Denies the set_always_on_top command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:deny-set-always-on-top" + ] + }, + { + "description": "core:window:deny-set-closable -> Denies the set_closable command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:deny-set-closable" + ] + }, + { + "description": "core:window:deny-set-content-protected -> Denies the set_content_protected command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:deny-set-content-protected" + ] + }, + { + "description": "core:window:deny-set-cursor-grab -> Denies the set_cursor_grab command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:deny-set-cursor-grab" + ] + }, + { + "description": "core:window:deny-set-cursor-icon -> Denies the set_cursor_icon command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:deny-set-cursor-icon" + ] + }, + { + "description": "core:window:deny-set-cursor-position -> Denies the set_cursor_position command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:deny-set-cursor-position" + ] + }, + { + "description": "core:window:deny-set-cursor-visible -> Denies the set_cursor_visible command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:deny-set-cursor-visible" + ] + }, + { + "description": "core:window:deny-set-decorations -> Denies the set_decorations command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:deny-set-decorations" + ] + }, + { + "description": "core:window:deny-set-effects -> Denies the set_effects command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:deny-set-effects" + ] + }, + { + "description": "core:window:deny-set-focus -> Denies the set_focus command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:deny-set-focus" + ] + }, + { + "description": "core:window:deny-set-fullscreen -> Denies the set_fullscreen command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:deny-set-fullscreen" + ] + }, + { + "description": "core:window:deny-set-icon -> Denies the set_icon command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:deny-set-icon" + ] + }, + { + "description": "core:window:deny-set-ignore-cursor-events -> Denies the set_ignore_cursor_events command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:deny-set-ignore-cursor-events" + ] + }, + { + "description": "core:window:deny-set-max-size -> Denies the set_max_size command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:deny-set-max-size" + ] + }, + { + "description": "core:window:deny-set-maximizable -> Denies the set_maximizable command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:deny-set-maximizable" + ] + }, + { + "description": "core:window:deny-set-min-size -> Denies the set_min_size command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:deny-set-min-size" + ] + }, + { + "description": "core:window:deny-set-minimizable -> Denies the set_minimizable command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:deny-set-minimizable" + ] + }, + { + "description": "core:window:deny-set-position -> Denies the set_position command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:deny-set-position" + ] + }, + { + "description": "core:window:deny-set-progress-bar -> Denies the set_progress_bar command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:deny-set-progress-bar" + ] + }, + { + "description": "core:window:deny-set-resizable -> Denies the set_resizable command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:deny-set-resizable" + ] + }, + { + "description": "core:window:deny-set-shadow -> Denies the set_shadow command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:deny-set-shadow" + ] + }, + { + "description": "core:window:deny-set-size -> Denies the set_size command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:deny-set-size" + ] + }, + { + "description": "core:window:deny-set-size-constraints -> Denies the set_size_constraints command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:deny-set-size-constraints" + ] + }, + { + "description": "core:window:deny-set-skip-taskbar -> Denies the set_skip_taskbar command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:deny-set-skip-taskbar" + ] + }, + { + "description": "core:window:deny-set-title -> Denies the set_title command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:deny-set-title" + ] + }, + { + "description": "core:window:deny-set-title-bar-style -> Denies the set_title_bar_style command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:deny-set-title-bar-style" + ] + }, + { + "description": "core:window:deny-set-visible-on-all-workspaces -> Denies the set_visible_on_all_workspaces command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:deny-set-visible-on-all-workspaces" + ] + }, + { + "description": "core:window:deny-show -> Denies the show command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:deny-show" + ] + }, + { + "description": "core:window:deny-start-dragging -> Denies the start_dragging command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:deny-start-dragging" + ] + }, + { + "description": "core:window:deny-start-resize-dragging -> Denies the start_resize_dragging command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:deny-start-resize-dragging" + ] + }, + { + "description": "core:window:deny-theme -> Denies the theme command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:deny-theme" + ] + }, + { + "description": "core:window:deny-title -> Denies the title command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:deny-title" + ] + }, + { + "description": "core:window:deny-toggle-maximize -> Denies the toggle_maximize command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:deny-toggle-maximize" + ] + }, + { + "description": "core:window:deny-unmaximize -> Denies the unmaximize command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:deny-unmaximize" + ] + }, + { + "description": "core:window:deny-unminimize -> Denies the unminimize command without any pre-configured scope.", + "type": "string", + "enum": [ + "core:window:deny-unminimize" + ] + }, + { + "description": "dialog:default -> This permission set configures the types of dialogs\navailable from the dialog plugin.\n\n#### Granted Permissions\n\nAll dialog types are enabled.\n\n\n", + "type": "string", + "enum": [ + "dialog:default" + ] + }, + { + "description": "dialog:allow-ask -> Enables the ask command without any pre-configured scope.", + "type": "string", + "enum": [ + "dialog:allow-ask" + ] + }, + { + "description": "dialog:allow-confirm -> Enables the confirm command without any pre-configured scope.", + "type": "string", + "enum": [ + "dialog:allow-confirm" + ] + }, + { + "description": "dialog:allow-message -> Enables the message command without any pre-configured scope.", + "type": "string", + "enum": [ + "dialog:allow-message" + ] + }, + { + "description": "dialog:allow-open -> Enables the open command without any pre-configured scope.", + "type": "string", + "enum": [ + "dialog:allow-open" + ] + }, + { + "description": "dialog:allow-save -> Enables the save command without any pre-configured scope.", + "type": "string", + "enum": [ + "dialog:allow-save" + ] + }, + { + "description": "dialog:deny-ask -> Denies the ask command without any pre-configured scope.", + "type": "string", + "enum": [ + "dialog:deny-ask" + ] + }, + { + "description": "dialog:deny-confirm -> Denies the confirm command without any pre-configured scope.", + "type": "string", + "enum": [ + "dialog:deny-confirm" + ] + }, + { + "description": "dialog:deny-message -> Denies the message command without any pre-configured scope.", + "type": "string", + "enum": [ + "dialog:deny-message" + ] + }, + { + "description": "dialog:deny-open -> Denies the open command without any pre-configured scope.", + "type": "string", + "enum": [ + "dialog:deny-open" + ] + }, + { + "description": "dialog:deny-save -> Denies the save command without any pre-configured scope.", + "type": "string", + "enum": [ + "dialog:deny-save" + ] + }, + { + "description": "fs:allow-app-meta -> This allows non-recursive read access to metadata of the `$APP` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-app-meta" + ] + }, + { + "description": "fs:allow-app-meta-recursive -> This allows full recursive read access to metadata of the `$APP` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-app-meta-recursive" + ] + }, + { + "description": "fs:allow-app-read -> This allows non-recursive read access to the `$APP` folder.", + "type": "string", + "enum": [ + "fs:allow-app-read" + ] + }, + { + "description": "fs:allow-app-read-recursive -> This allows full recursive read access to the complete `$APP` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-app-read-recursive" + ] + }, + { + "description": "fs:allow-app-write -> This allows non-recursive write access to the `$APP` folder.", + "type": "string", + "enum": [ + "fs:allow-app-write" + ] + }, + { + "description": "fs:allow-app-write-recursive -> This allows full recursive write access to the complete `$APP` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-app-write-recursive" + ] + }, + { + "description": "fs:allow-appcache-meta -> This allows non-recursive read access to metadata of the `$APPCACHE` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-appcache-meta" + ] + }, + { + "description": "fs:allow-appcache-meta-recursive -> This allows full recursive read access to metadata of the `$APPCACHE` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-appcache-meta-recursive" + ] + }, + { + "description": "fs:allow-appcache-read -> This allows non-recursive read access to the `$APPCACHE` folder.", + "type": "string", + "enum": [ + "fs:allow-appcache-read" + ] + }, + { + "description": "fs:allow-appcache-read-recursive -> This allows full recursive read access to the complete `$APPCACHE` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-appcache-read-recursive" + ] + }, + { + "description": "fs:allow-appcache-write -> This allows non-recursive write access to the `$APPCACHE` folder.", + "type": "string", + "enum": [ + "fs:allow-appcache-write" + ] + }, + { + "description": "fs:allow-appcache-write-recursive -> This allows full recursive write access to the complete `$APPCACHE` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-appcache-write-recursive" + ] + }, + { + "description": "fs:allow-appconfig-meta -> This allows non-recursive read access to metadata of the `$APPCONFIG` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-appconfig-meta" + ] + }, + { + "description": "fs:allow-appconfig-meta-recursive -> This allows full recursive read access to metadata of the `$APPCONFIG` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-appconfig-meta-recursive" + ] + }, + { + "description": "fs:allow-appconfig-read -> This allows non-recursive read access to the `$APPCONFIG` folder.", + "type": "string", + "enum": [ + "fs:allow-appconfig-read" + ] + }, + { + "description": "fs:allow-appconfig-read-recursive -> This allows full recursive read access to the complete `$APPCONFIG` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-appconfig-read-recursive" + ] + }, + { + "description": "fs:allow-appconfig-write -> This allows non-recursive write access to the `$APPCONFIG` folder.", + "type": "string", + "enum": [ + "fs:allow-appconfig-write" + ] + }, + { + "description": "fs:allow-appconfig-write-recursive -> This allows full recursive write access to the complete `$APPCONFIG` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-appconfig-write-recursive" + ] + }, + { + "description": "fs:allow-appdata-meta -> This allows non-recursive read access to metadata of the `$APPDATA` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-appdata-meta" + ] + }, + { + "description": "fs:allow-appdata-meta-recursive -> This allows full recursive read access to metadata of the `$APPDATA` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-appdata-meta-recursive" + ] + }, + { + "description": "fs:allow-appdata-read -> This allows non-recursive read access to the `$APPDATA` folder.", + "type": "string", + "enum": [ + "fs:allow-appdata-read" + ] + }, + { + "description": "fs:allow-appdata-read-recursive -> This allows full recursive read access to the complete `$APPDATA` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-appdata-read-recursive" + ] + }, + { + "description": "fs:allow-appdata-write -> This allows non-recursive write access to the `$APPDATA` folder.", + "type": "string", + "enum": [ + "fs:allow-appdata-write" + ] + }, + { + "description": "fs:allow-appdata-write-recursive -> This allows full recursive write access to the complete `$APPDATA` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-appdata-write-recursive" + ] + }, + { + "description": "fs:allow-applocaldata-meta -> This allows non-recursive read access to metadata of the `$APPLOCALDATA` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-applocaldata-meta" + ] + }, + { + "description": "fs:allow-applocaldata-meta-recursive -> This allows full recursive read access to metadata of the `$APPLOCALDATA` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-applocaldata-meta-recursive" + ] + }, + { + "description": "fs:allow-applocaldata-read -> This allows non-recursive read access to the `$APPLOCALDATA` folder.", + "type": "string", + "enum": [ + "fs:allow-applocaldata-read" + ] + }, + { + "description": "fs:allow-applocaldata-read-recursive -> This allows full recursive read access to the complete `$APPLOCALDATA` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-applocaldata-read-recursive" + ] + }, + { + "description": "fs:allow-applocaldata-write -> This allows non-recursive write access to the `$APPLOCALDATA` folder.", + "type": "string", + "enum": [ + "fs:allow-applocaldata-write" + ] + }, + { + "description": "fs:allow-applocaldata-write-recursive -> This allows full recursive write access to the complete `$APPLOCALDATA` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-applocaldata-write-recursive" + ] + }, + { + "description": "fs:allow-applog-meta -> This allows non-recursive read access to metadata of the `$APPLOG` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-applog-meta" + ] + }, + { + "description": "fs:allow-applog-meta-recursive -> This allows full recursive read access to metadata of the `$APPLOG` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-applog-meta-recursive" + ] + }, + { + "description": "fs:allow-applog-read -> This allows non-recursive read access to the `$APPLOG` folder.", + "type": "string", + "enum": [ + "fs:allow-applog-read" + ] + }, + { + "description": "fs:allow-applog-read-recursive -> This allows full recursive read access to the complete `$APPLOG` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-applog-read-recursive" + ] + }, + { + "description": "fs:allow-applog-write -> This allows non-recursive write access to the `$APPLOG` folder.", + "type": "string", + "enum": [ + "fs:allow-applog-write" + ] + }, + { + "description": "fs:allow-applog-write-recursive -> This allows full recursive write access to the complete `$APPLOG` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-applog-write-recursive" + ] + }, + { + "description": "fs:allow-audio-meta -> This allows non-recursive read access to metadata of the `$AUDIO` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-audio-meta" + ] + }, + { + "description": "fs:allow-audio-meta-recursive -> This allows full recursive read access to metadata of the `$AUDIO` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-audio-meta-recursive" + ] + }, + { + "description": "fs:allow-audio-read -> This allows non-recursive read access to the `$AUDIO` folder.", + "type": "string", + "enum": [ + "fs:allow-audio-read" + ] + }, + { + "description": "fs:allow-audio-read-recursive -> This allows full recursive read access to the complete `$AUDIO` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-audio-read-recursive" + ] + }, + { + "description": "fs:allow-audio-write -> This allows non-recursive write access to the `$AUDIO` folder.", + "type": "string", + "enum": [ + "fs:allow-audio-write" + ] + }, + { + "description": "fs:allow-audio-write-recursive -> This allows full recursive write access to the complete `$AUDIO` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-audio-write-recursive" + ] + }, + { + "description": "fs:allow-cache-meta -> This allows non-recursive read access to metadata of the `$CACHE` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-cache-meta" + ] + }, + { + "description": "fs:allow-cache-meta-recursive -> This allows full recursive read access to metadata of the `$CACHE` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-cache-meta-recursive" + ] + }, + { + "description": "fs:allow-cache-read -> This allows non-recursive read access to the `$CACHE` folder.", + "type": "string", + "enum": [ + "fs:allow-cache-read" + ] + }, + { + "description": "fs:allow-cache-read-recursive -> This allows full recursive read access to the complete `$CACHE` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-cache-read-recursive" + ] + }, + { + "description": "fs:allow-cache-write -> This allows non-recursive write access to the `$CACHE` folder.", + "type": "string", + "enum": [ + "fs:allow-cache-write" + ] + }, + { + "description": "fs:allow-cache-write-recursive -> This allows full recursive write access to the complete `$CACHE` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-cache-write-recursive" + ] + }, + { + "description": "fs:allow-config-meta -> This allows non-recursive read access to metadata of the `$CONFIG` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-config-meta" + ] + }, + { + "description": "fs:allow-config-meta-recursive -> This allows full recursive read access to metadata of the `$CONFIG` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-config-meta-recursive" + ] + }, + { + "description": "fs:allow-config-read -> This allows non-recursive read access to the `$CONFIG` folder.", + "type": "string", + "enum": [ + "fs:allow-config-read" + ] + }, + { + "description": "fs:allow-config-read-recursive -> This allows full recursive read access to the complete `$CONFIG` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-config-read-recursive" + ] + }, + { + "description": "fs:allow-config-write -> This allows non-recursive write access to the `$CONFIG` folder.", + "type": "string", + "enum": [ + "fs:allow-config-write" + ] + }, + { + "description": "fs:allow-config-write-recursive -> This allows full recursive write access to the complete `$CONFIG` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-config-write-recursive" + ] + }, + { + "description": "fs:allow-data-meta -> This allows non-recursive read access to metadata of the `$DATA` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-data-meta" + ] + }, + { + "description": "fs:allow-data-meta-recursive -> This allows full recursive read access to metadata of the `$DATA` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-data-meta-recursive" + ] + }, + { + "description": "fs:allow-data-read -> This allows non-recursive read access to the `$DATA` folder.", + "type": "string", + "enum": [ + "fs:allow-data-read" + ] + }, + { + "description": "fs:allow-data-read-recursive -> This allows full recursive read access to the complete `$DATA` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-data-read-recursive" + ] + }, + { + "description": "fs:allow-data-write -> This allows non-recursive write access to the `$DATA` folder.", + "type": "string", + "enum": [ + "fs:allow-data-write" + ] + }, + { + "description": "fs:allow-data-write-recursive -> This allows full recursive write access to the complete `$DATA` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-data-write-recursive" + ] + }, + { + "description": "fs:allow-desktop-meta -> This allows non-recursive read access to metadata of the `$DESKTOP` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-desktop-meta" + ] + }, + { + "description": "fs:allow-desktop-meta-recursive -> This allows full recursive read access to metadata of the `$DESKTOP` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-desktop-meta-recursive" + ] + }, + { + "description": "fs:allow-desktop-read -> This allows non-recursive read access to the `$DESKTOP` folder.", + "type": "string", + "enum": [ + "fs:allow-desktop-read" + ] + }, + { + "description": "fs:allow-desktop-read-recursive -> This allows full recursive read access to the complete `$DESKTOP` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-desktop-read-recursive" + ] + }, + { + "description": "fs:allow-desktop-write -> This allows non-recursive write access to the `$DESKTOP` folder.", + "type": "string", + "enum": [ + "fs:allow-desktop-write" + ] + }, + { + "description": "fs:allow-desktop-write-recursive -> This allows full recursive write access to the complete `$DESKTOP` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-desktop-write-recursive" + ] + }, + { + "description": "fs:allow-document-meta -> This allows non-recursive read access to metadata of the `$DOCUMENT` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-document-meta" + ] + }, + { + "description": "fs:allow-document-meta-recursive -> This allows full recursive read access to metadata of the `$DOCUMENT` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-document-meta-recursive" + ] + }, + { + "description": "fs:allow-document-read -> This allows non-recursive read access to the `$DOCUMENT` folder.", + "type": "string", + "enum": [ + "fs:allow-document-read" + ] + }, + { + "description": "fs:allow-document-read-recursive -> This allows full recursive read access to the complete `$DOCUMENT` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-document-read-recursive" + ] + }, + { + "description": "fs:allow-document-write -> This allows non-recursive write access to the `$DOCUMENT` folder.", + "type": "string", + "enum": [ + "fs:allow-document-write" + ] + }, + { + "description": "fs:allow-document-write-recursive -> This allows full recursive write access to the complete `$DOCUMENT` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-document-write-recursive" + ] + }, + { + "description": "fs:allow-download-meta -> This allows non-recursive read access to metadata of the `$DOWNLOAD` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-download-meta" + ] + }, + { + "description": "fs:allow-download-meta-recursive -> This allows full recursive read access to metadata of the `$DOWNLOAD` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-download-meta-recursive" + ] + }, + { + "description": "fs:allow-download-read -> This allows non-recursive read access to the `$DOWNLOAD` folder.", + "type": "string", + "enum": [ + "fs:allow-download-read" + ] + }, + { + "description": "fs:allow-download-read-recursive -> This allows full recursive read access to the complete `$DOWNLOAD` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-download-read-recursive" + ] + }, + { + "description": "fs:allow-download-write -> This allows non-recursive write access to the `$DOWNLOAD` folder.", + "type": "string", + "enum": [ + "fs:allow-download-write" + ] + }, + { + "description": "fs:allow-download-write-recursive -> This allows full recursive write access to the complete `$DOWNLOAD` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-download-write-recursive" + ] + }, + { + "description": "fs:allow-exe-meta -> This allows non-recursive read access to metadata of the `$EXE` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-exe-meta" + ] + }, + { + "description": "fs:allow-exe-meta-recursive -> This allows full recursive read access to metadata of the `$EXE` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-exe-meta-recursive" + ] + }, + { + "description": "fs:allow-exe-read -> This allows non-recursive read access to the `$EXE` folder.", + "type": "string", + "enum": [ + "fs:allow-exe-read" + ] + }, + { + "description": "fs:allow-exe-read-recursive -> This allows full recursive read access to the complete `$EXE` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-exe-read-recursive" + ] + }, + { + "description": "fs:allow-exe-write -> This allows non-recursive write access to the `$EXE` folder.", + "type": "string", + "enum": [ + "fs:allow-exe-write" + ] + }, + { + "description": "fs:allow-exe-write-recursive -> This allows full recursive write access to the complete `$EXE` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-exe-write-recursive" + ] + }, + { + "description": "fs:allow-font-meta -> This allows non-recursive read access to metadata of the `$FONT` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-font-meta" + ] + }, + { + "description": "fs:allow-font-meta-recursive -> This allows full recursive read access to metadata of the `$FONT` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-font-meta-recursive" + ] + }, + { + "description": "fs:allow-font-read -> This allows non-recursive read access to the `$FONT` folder.", + "type": "string", + "enum": [ + "fs:allow-font-read" + ] + }, + { + "description": "fs:allow-font-read-recursive -> This allows full recursive read access to the complete `$FONT` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-font-read-recursive" + ] + }, + { + "description": "fs:allow-font-write -> This allows non-recursive write access to the `$FONT` folder.", + "type": "string", + "enum": [ + "fs:allow-font-write" + ] + }, + { + "description": "fs:allow-font-write-recursive -> This allows full recursive write access to the complete `$FONT` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-font-write-recursive" + ] + }, + { + "description": "fs:allow-home-meta -> This allows non-recursive read access to metadata of the `$HOME` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-home-meta" + ] + }, + { + "description": "fs:allow-home-meta-recursive -> This allows full recursive read access to metadata of the `$HOME` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-home-meta-recursive" + ] + }, + { + "description": "fs:allow-home-read -> This allows non-recursive read access to the `$HOME` folder.", + "type": "string", + "enum": [ + "fs:allow-home-read" + ] + }, + { + "description": "fs:allow-home-read-recursive -> This allows full recursive read access to the complete `$HOME` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-home-read-recursive" + ] + }, + { + "description": "fs:allow-home-write -> This allows non-recursive write access to the `$HOME` folder.", + "type": "string", + "enum": [ + "fs:allow-home-write" + ] + }, + { + "description": "fs:allow-home-write-recursive -> This allows full recursive write access to the complete `$HOME` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-home-write-recursive" + ] + }, + { + "description": "fs:allow-localdata-meta -> This allows non-recursive read access to metadata of the `$LOCALDATA` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-localdata-meta" + ] + }, + { + "description": "fs:allow-localdata-meta-recursive -> This allows full recursive read access to metadata of the `$LOCALDATA` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-localdata-meta-recursive" + ] + }, + { + "description": "fs:allow-localdata-read -> This allows non-recursive read access to the `$LOCALDATA` folder.", + "type": "string", + "enum": [ + "fs:allow-localdata-read" + ] + }, + { + "description": "fs:allow-localdata-read-recursive -> This allows full recursive read access to the complete `$LOCALDATA` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-localdata-read-recursive" + ] + }, + { + "description": "fs:allow-localdata-write -> This allows non-recursive write access to the `$LOCALDATA` folder.", + "type": "string", + "enum": [ + "fs:allow-localdata-write" + ] + }, + { + "description": "fs:allow-localdata-write-recursive -> This allows full recursive write access to the complete `$LOCALDATA` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-localdata-write-recursive" + ] + }, + { + "description": "fs:allow-log-meta -> This allows non-recursive read access to metadata of the `$LOG` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-log-meta" + ] + }, + { + "description": "fs:allow-log-meta-recursive -> This allows full recursive read access to metadata of the `$LOG` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-log-meta-recursive" + ] + }, + { + "description": "fs:allow-log-read -> This allows non-recursive read access to the `$LOG` folder.", + "type": "string", + "enum": [ + "fs:allow-log-read" + ] + }, + { + "description": "fs:allow-log-read-recursive -> This allows full recursive read access to the complete `$LOG` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-log-read-recursive" + ] + }, + { + "description": "fs:allow-log-write -> This allows non-recursive write access to the `$LOG` folder.", + "type": "string", + "enum": [ + "fs:allow-log-write" + ] + }, + { + "description": "fs:allow-log-write-recursive -> This allows full recursive write access to the complete `$LOG` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-log-write-recursive" + ] + }, + { + "description": "fs:allow-picture-meta -> This allows non-recursive read access to metadata of the `$PICTURE` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-picture-meta" + ] + }, + { + "description": "fs:allow-picture-meta-recursive -> This allows full recursive read access to metadata of the `$PICTURE` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-picture-meta-recursive" + ] + }, + { + "description": "fs:allow-picture-read -> This allows non-recursive read access to the `$PICTURE` folder.", + "type": "string", + "enum": [ + "fs:allow-picture-read" + ] + }, + { + "description": "fs:allow-picture-read-recursive -> This allows full recursive read access to the complete `$PICTURE` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-picture-read-recursive" + ] + }, + { + "description": "fs:allow-picture-write -> This allows non-recursive write access to the `$PICTURE` folder.", + "type": "string", + "enum": [ + "fs:allow-picture-write" + ] + }, + { + "description": "fs:allow-picture-write-recursive -> This allows full recursive write access to the complete `$PICTURE` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-picture-write-recursive" + ] + }, + { + "description": "fs:allow-public-meta -> This allows non-recursive read access to metadata of the `$PUBLIC` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-public-meta" + ] + }, + { + "description": "fs:allow-public-meta-recursive -> This allows full recursive read access to metadata of the `$PUBLIC` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-public-meta-recursive" + ] + }, + { + "description": "fs:allow-public-read -> This allows non-recursive read access to the `$PUBLIC` folder.", + "type": "string", + "enum": [ + "fs:allow-public-read" + ] + }, + { + "description": "fs:allow-public-read-recursive -> This allows full recursive read access to the complete `$PUBLIC` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-public-read-recursive" + ] + }, + { + "description": "fs:allow-public-write -> This allows non-recursive write access to the `$PUBLIC` folder.", + "type": "string", + "enum": [ + "fs:allow-public-write" + ] + }, + { + "description": "fs:allow-public-write-recursive -> This allows full recursive write access to the complete `$PUBLIC` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-public-write-recursive" + ] + }, + { + "description": "fs:allow-resource-meta -> This allows non-recursive read access to metadata of the `$RESOURCE` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-resource-meta" + ] + }, + { + "description": "fs:allow-resource-meta-recursive -> This allows full recursive read access to metadata of the `$RESOURCE` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-resource-meta-recursive" + ] + }, + { + "description": "fs:allow-resource-read -> This allows non-recursive read access to the `$RESOURCE` folder.", + "type": "string", + "enum": [ + "fs:allow-resource-read" + ] + }, + { + "description": "fs:allow-resource-read-recursive -> This allows full recursive read access to the complete `$RESOURCE` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-resource-read-recursive" + ] + }, + { + "description": "fs:allow-resource-write -> This allows non-recursive write access to the `$RESOURCE` folder.", + "type": "string", + "enum": [ + "fs:allow-resource-write" + ] + }, + { + "description": "fs:allow-resource-write-recursive -> This allows full recursive write access to the complete `$RESOURCE` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-resource-write-recursive" + ] + }, + { + "description": "fs:allow-runtime-meta -> This allows non-recursive read access to metadata of the `$RUNTIME` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-runtime-meta" + ] + }, + { + "description": "fs:allow-runtime-meta-recursive -> This allows full recursive read access to metadata of the `$RUNTIME` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-runtime-meta-recursive" + ] + }, + { + "description": "fs:allow-runtime-read -> This allows non-recursive read access to the `$RUNTIME` folder.", + "type": "string", + "enum": [ + "fs:allow-runtime-read" + ] + }, + { + "description": "fs:allow-runtime-read-recursive -> This allows full recursive read access to the complete `$RUNTIME` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-runtime-read-recursive" + ] + }, + { + "description": "fs:allow-runtime-write -> This allows non-recursive write access to the `$RUNTIME` folder.", + "type": "string", + "enum": [ + "fs:allow-runtime-write" + ] + }, + { + "description": "fs:allow-runtime-write-recursive -> This allows full recursive write access to the complete `$RUNTIME` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-runtime-write-recursive" + ] + }, + { + "description": "fs:allow-temp-meta -> This allows non-recursive read access to metadata of the `$TEMP` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-temp-meta" + ] + }, + { + "description": "fs:allow-temp-meta-recursive -> This allows full recursive read access to metadata of the `$TEMP` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-temp-meta-recursive" + ] + }, + { + "description": "fs:allow-temp-read -> This allows non-recursive read access to the `$TEMP` folder.", + "type": "string", + "enum": [ + "fs:allow-temp-read" + ] + }, + { + "description": "fs:allow-temp-read-recursive -> This allows full recursive read access to the complete `$TEMP` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-temp-read-recursive" + ] + }, + { + "description": "fs:allow-temp-write -> This allows non-recursive write access to the `$TEMP` folder.", + "type": "string", + "enum": [ + "fs:allow-temp-write" + ] + }, + { + "description": "fs:allow-temp-write-recursive -> This allows full recursive write access to the complete `$TEMP` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-temp-write-recursive" + ] + }, + { + "description": "fs:allow-template-meta -> This allows non-recursive read access to metadata of the `$TEMPLATE` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-template-meta" + ] + }, + { + "description": "fs:allow-template-meta-recursive -> This allows full recursive read access to metadata of the `$TEMPLATE` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-template-meta-recursive" + ] + }, + { + "description": "fs:allow-template-read -> This allows non-recursive read access to the `$TEMPLATE` folder.", + "type": "string", + "enum": [ + "fs:allow-template-read" + ] + }, + { + "description": "fs:allow-template-read-recursive -> This allows full recursive read access to the complete `$TEMPLATE` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-template-read-recursive" + ] + }, + { + "description": "fs:allow-template-write -> This allows non-recursive write access to the `$TEMPLATE` folder.", + "type": "string", + "enum": [ + "fs:allow-template-write" + ] + }, + { + "description": "fs:allow-template-write-recursive -> This allows full recursive write access to the complete `$TEMPLATE` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-template-write-recursive" + ] + }, + { + "description": "fs:allow-video-meta -> This allows non-recursive read access to metadata of the `$VIDEO` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-video-meta" + ] + }, + { + "description": "fs:allow-video-meta-recursive -> This allows full recursive read access to metadata of the `$VIDEO` folder, including file listing and statistics.", + "type": "string", + "enum": [ + "fs:allow-video-meta-recursive" + ] + }, + { + "description": "fs:allow-video-read -> This allows non-recursive read access to the `$VIDEO` folder.", + "type": "string", + "enum": [ + "fs:allow-video-read" + ] + }, + { + "description": "fs:allow-video-read-recursive -> This allows full recursive read access to the complete `$VIDEO` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-video-read-recursive" + ] + }, + { + "description": "fs:allow-video-write -> This allows non-recursive write access to the `$VIDEO` folder.", + "type": "string", + "enum": [ + "fs:allow-video-write" + ] + }, + { + "description": "fs:allow-video-write-recursive -> This allows full recursive write access to the complete `$VIDEO` folder, files and subdirectories.", + "type": "string", + "enum": [ + "fs:allow-video-write-recursive" + ] + }, + { + "description": "fs:deny-default -> This denies access to dangerous Tauri relevant files and folders by default.", + "type": "string", + "enum": [ + "fs:deny-default" + ] + }, + { + "description": "fs:default -> This set of permissions describes the what kind of\nfile system access the `fs` plugin has enabled or denied by default.\n\n#### Granted Permissions\n\nThis default permission set enables read access to the\napplication specific directories (AppConfig, AppData, AppLocalData, AppCache,\nAppLog) and all files and sub directories created in it.\nThe location of these directories depends on the operating system,\nwhere the application is run.\n\nIn general these directories need to be manually created\nby the application at runtime, before accessing files or folders\nin it is possible.\n\nTherefore, it is also allowed to create all of these folders via\nthe `mkdir` command.\n\n#### Denied Permissions\n\nThis default permission set prevents access to critical components\nof the Tauri application by default.\nOn Windows the webview data folder access is denied.\n\n", + "type": "string", + "enum": [ + "fs:default" + ] + }, + { + "description": "fs:allow-copy-file -> Enables the copy_file command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:allow-copy-file" + ] + }, + { + "description": "fs:allow-create -> Enables the create command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:allow-create" + ] + }, + { + "description": "fs:allow-exists -> Enables the exists command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:allow-exists" + ] + }, + { + "description": "fs:allow-fstat -> Enables the fstat command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:allow-fstat" + ] + }, + { + "description": "fs:allow-ftruncate -> Enables the ftruncate command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:allow-ftruncate" + ] + }, + { + "description": "fs:allow-lstat -> Enables the lstat command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:allow-lstat" + ] + }, + { + "description": "fs:allow-mkdir -> Enables the mkdir command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:allow-mkdir" + ] + }, + { + "description": "fs:allow-open -> Enables the open command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:allow-open" + ] + }, + { + "description": "fs:allow-read -> Enables the read command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:allow-read" + ] + }, + { + "description": "fs:allow-read-dir -> Enables the read_dir command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:allow-read-dir" + ] + }, + { + "description": "fs:allow-read-file -> Enables the read_file command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:allow-read-file" + ] + }, + { + "description": "fs:allow-read-text-file -> Enables the read_text_file command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:allow-read-text-file" + ] + }, + { + "description": "fs:allow-read-text-file-lines -> Enables the read_text_file_lines command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:allow-read-text-file-lines" + ] + }, + { + "description": "fs:allow-read-text-file-lines-next -> Enables the read_text_file_lines_next command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:allow-read-text-file-lines-next" + ] + }, + { + "description": "fs:allow-remove -> Enables the remove command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:allow-remove" + ] + }, + { + "description": "fs:allow-rename -> Enables the rename command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:allow-rename" + ] + }, + { + "description": "fs:allow-seek -> Enables the seek command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:allow-seek" + ] + }, + { + "description": "fs:allow-stat -> Enables the stat command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:allow-stat" + ] + }, + { + "description": "fs:allow-truncate -> Enables the truncate command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:allow-truncate" + ] + }, + { + "description": "fs:allow-unwatch -> Enables the unwatch command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:allow-unwatch" + ] + }, + { + "description": "fs:allow-watch -> Enables the watch command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:allow-watch" + ] + }, + { + "description": "fs:allow-write -> Enables the write command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:allow-write" + ] + }, + { + "description": "fs:allow-write-file -> Enables the write_file command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:allow-write-file" + ] + }, + { + "description": "fs:allow-write-text-file -> Enables the write_text_file command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:allow-write-text-file" + ] + }, + { + "description": "fs:create-app-specific-dirs -> This permissions allows to create the application specific directories.\n", + "type": "string", + "enum": [ + "fs:create-app-specific-dirs" + ] + }, + { + "description": "fs:deny-copy-file -> Denies the copy_file command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:deny-copy-file" + ] + }, + { + "description": "fs:deny-create -> Denies the create command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:deny-create" + ] + }, + { + "description": "fs:deny-exists -> Denies the exists command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:deny-exists" + ] + }, + { + "description": "fs:deny-fstat -> Denies the fstat command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:deny-fstat" + ] + }, + { + "description": "fs:deny-ftruncate -> Denies the ftruncate command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:deny-ftruncate" + ] + }, + { + "description": "fs:deny-lstat -> Denies the lstat command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:deny-lstat" + ] + }, + { + "description": "fs:deny-mkdir -> Denies the mkdir command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:deny-mkdir" + ] + }, + { + "description": "fs:deny-open -> Denies the open command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:deny-open" + ] + }, + { + "description": "fs:deny-read -> Denies the read command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:deny-read" + ] + }, + { + "description": "fs:deny-read-dir -> Denies the read_dir command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:deny-read-dir" + ] + }, + { + "description": "fs:deny-read-file -> Denies the read_file command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:deny-read-file" + ] + }, + { + "description": "fs:deny-read-text-file -> Denies the read_text_file command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:deny-read-text-file" + ] + }, + { + "description": "fs:deny-read-text-file-lines -> Denies the read_text_file_lines command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:deny-read-text-file-lines" + ] + }, + { + "description": "fs:deny-read-text-file-lines-next -> Denies the read_text_file_lines_next command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:deny-read-text-file-lines-next" + ] + }, + { + "description": "fs:deny-remove -> Denies the remove command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:deny-remove" + ] + }, + { + "description": "fs:deny-rename -> Denies the rename command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:deny-rename" + ] + }, + { + "description": "fs:deny-seek -> Denies the seek command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:deny-seek" + ] + }, + { + "description": "fs:deny-stat -> Denies the stat command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:deny-stat" + ] + }, + { + "description": "fs:deny-truncate -> Denies the truncate command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:deny-truncate" + ] + }, + { + "description": "fs:deny-unwatch -> Denies the unwatch command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:deny-unwatch" + ] + }, + { + "description": "fs:deny-watch -> Denies the watch command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:deny-watch" + ] + }, + { + "description": "fs:deny-webview-data-linux -> This denies read access to the\n`$APPLOCALDATA` folder on linux as the webview data and configuration values are stored here.\nAllowing access can lead to sensitive information disclosure and should be well considered.", + "type": "string", + "enum": [ + "fs:deny-webview-data-linux" + ] + }, + { + "description": "fs:deny-webview-data-windows -> This denies read access to the\n`$APPLOCALDATA/EBWebView` folder on windows as the webview data and configuration values are stored here.\nAllowing access can lead to sensitive information disclosure and should be well considered.", + "type": "string", + "enum": [ + "fs:deny-webview-data-windows" + ] + }, + { + "description": "fs:deny-write -> Denies the write command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:deny-write" + ] + }, + { + "description": "fs:deny-write-file -> Denies the write_file command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:deny-write-file" + ] + }, + { + "description": "fs:deny-write-text-file -> Denies the write_text_file command without any pre-configured scope.", + "type": "string", + "enum": [ + "fs:deny-write-text-file" + ] + }, + { + "description": "fs:read-all -> This enables all read related commands without any pre-configured accessible paths.", + "type": "string", + "enum": [ + "fs:read-all" + ] + }, + { + "description": "fs:read-app-specific-dirs-recursive -> This permission allows recursive read functionality on the application\nspecific base directories. \n", + "type": "string", + "enum": [ + "fs:read-app-specific-dirs-recursive" + ] + }, + { + "description": "fs:read-dirs -> This enables directory read and file metadata related commands without any pre-configured accessible paths.", + "type": "string", + "enum": [ + "fs:read-dirs" + ] + }, + { + "description": "fs:read-files -> This enables file read related commands without any pre-configured accessible paths.", + "type": "string", + "enum": [ + "fs:read-files" + ] + }, + { + "description": "fs:read-meta -> This enables all index or metadata related commands without any pre-configured accessible paths.", + "type": "string", + "enum": [ + "fs:read-meta" + ] + }, + { + "description": "fs:scope -> An empty permission you can use to modify the global scope.", + "type": "string", + "enum": [ + "fs:scope" + ] + }, + { + "description": "fs:scope-app -> This scope permits access to all files and list content of top level directories in the `$APP`folder.", + "type": "string", + "enum": [ + "fs:scope-app" + ] + }, + { + "description": "fs:scope-app-index -> This scope permits to list all files and folders in the `$APP`folder.", + "type": "string", + "enum": [ + "fs:scope-app-index" + ] + }, + { + "description": "fs:scope-app-recursive -> This scope permits recursive access to the complete `$APP` folder, including sub directories and files.", + "type": "string", + "enum": [ + "fs:scope-app-recursive" + ] + }, + { + "description": "fs:scope-appcache -> This scope permits access to all files and list content of top level directories in the `$APPCACHE`folder.", + "type": "string", + "enum": [ + "fs:scope-appcache" + ] + }, + { + "description": "fs:scope-appcache-index -> This scope permits to list all files and folders in the `$APPCACHE`folder.", + "type": "string", + "enum": [ + "fs:scope-appcache-index" + ] + }, + { + "description": "fs:scope-appcache-recursive -> This scope permits recursive access to the complete `$APPCACHE` folder, including sub directories and files.", + "type": "string", + "enum": [ + "fs:scope-appcache-recursive" + ] + }, + { + "description": "fs:scope-appconfig -> This scope permits access to all files and list content of top level directories in the `$APPCONFIG`folder.", + "type": "string", + "enum": [ + "fs:scope-appconfig" + ] + }, + { + "description": "fs:scope-appconfig-index -> This scope permits to list all files and folders in the `$APPCONFIG`folder.", + "type": "string", + "enum": [ + "fs:scope-appconfig-index" + ] + }, + { + "description": "fs:scope-appconfig-recursive -> This scope permits recursive access to the complete `$APPCONFIG` folder, including sub directories and files.", + "type": "string", + "enum": [ + "fs:scope-appconfig-recursive" + ] + }, + { + "description": "fs:scope-appdata -> This scope permits access to all files and list content of top level directories in the `$APPDATA`folder.", + "type": "string", + "enum": [ + "fs:scope-appdata" + ] + }, + { + "description": "fs:scope-appdata-index -> This scope permits to list all files and folders in the `$APPDATA`folder.", + "type": "string", + "enum": [ + "fs:scope-appdata-index" + ] + }, + { + "description": "fs:scope-appdata-recursive -> This scope permits recursive access to the complete `$APPDATA` folder, including sub directories and files.", + "type": "string", + "enum": [ + "fs:scope-appdata-recursive" + ] + }, + { + "description": "fs:scope-applocaldata -> This scope permits access to all files and list content of top level directories in the `$APPLOCALDATA`folder.", + "type": "string", + "enum": [ + "fs:scope-applocaldata" + ] + }, + { + "description": "fs:scope-applocaldata-index -> This scope permits to list all files and folders in the `$APPLOCALDATA`folder.", + "type": "string", + "enum": [ + "fs:scope-applocaldata-index" + ] + }, + { + "description": "fs:scope-applocaldata-recursive -> This scope permits recursive access to the complete `$APPLOCALDATA` folder, including sub directories and files.", + "type": "string", + "enum": [ + "fs:scope-applocaldata-recursive" + ] + }, + { + "description": "fs:scope-applog -> This scope permits access to all files and list content of top level directories in the `$APPLOG`folder.", + "type": "string", + "enum": [ + "fs:scope-applog" + ] + }, + { + "description": "fs:scope-applog-index -> This scope permits to list all files and folders in the `$APPLOG`folder.", + "type": "string", + "enum": [ + "fs:scope-applog-index" + ] + }, + { + "description": "fs:scope-applog-recursive -> This scope permits recursive access to the complete `$APPLOG` folder, including sub directories and files.", + "type": "string", + "enum": [ + "fs:scope-applog-recursive" + ] + }, + { + "description": "fs:scope-audio -> This scope permits access to all files and list content of top level directories in the `$AUDIO`folder.", + "type": "string", + "enum": [ + "fs:scope-audio" + ] + }, + { + "description": "fs:scope-audio-index -> This scope permits to list all files and folders in the `$AUDIO`folder.", + "type": "string", + "enum": [ + "fs:scope-audio-index" + ] + }, + { + "description": "fs:scope-audio-recursive -> This scope permits recursive access to the complete `$AUDIO` folder, including sub directories and files.", + "type": "string", + "enum": [ + "fs:scope-audio-recursive" + ] + }, + { + "description": "fs:scope-cache -> This scope permits access to all files and list content of top level directories in the `$CACHE`folder.", + "type": "string", + "enum": [ + "fs:scope-cache" + ] + }, + { + "description": "fs:scope-cache-index -> This scope permits to list all files and folders in the `$CACHE`folder.", + "type": "string", + "enum": [ + "fs:scope-cache-index" + ] + }, + { + "description": "fs:scope-cache-recursive -> This scope permits recursive access to the complete `$CACHE` folder, including sub directories and files.", + "type": "string", + "enum": [ + "fs:scope-cache-recursive" + ] + }, + { + "description": "fs:scope-config -> This scope permits access to all files and list content of top level directories in the `$CONFIG`folder.", + "type": "string", + "enum": [ + "fs:scope-config" + ] + }, + { + "description": "fs:scope-config-index -> This scope permits to list all files and folders in the `$CONFIG`folder.", + "type": "string", + "enum": [ + "fs:scope-config-index" + ] + }, + { + "description": "fs:scope-config-recursive -> This scope permits recursive access to the complete `$CONFIG` folder, including sub directories and files.", + "type": "string", + "enum": [ + "fs:scope-config-recursive" + ] + }, + { + "description": "fs:scope-data -> This scope permits access to all files and list content of top level directories in the `$DATA`folder.", + "type": "string", + "enum": [ + "fs:scope-data" + ] + }, + { + "description": "fs:scope-data-index -> This scope permits to list all files and folders in the `$DATA`folder.", + "type": "string", + "enum": [ + "fs:scope-data-index" + ] + }, + { + "description": "fs:scope-data-recursive -> This scope permits recursive access to the complete `$DATA` folder, including sub directories and files.", + "type": "string", + "enum": [ + "fs:scope-data-recursive" + ] + }, + { + "description": "fs:scope-desktop -> This scope permits access to all files and list content of top level directories in the `$DESKTOP`folder.", + "type": "string", + "enum": [ + "fs:scope-desktop" + ] + }, + { + "description": "fs:scope-desktop-index -> This scope permits to list all files and folders in the `$DESKTOP`folder.", + "type": "string", + "enum": [ + "fs:scope-desktop-index" + ] + }, + { + "description": "fs:scope-desktop-recursive -> This scope permits recursive access to the complete `$DESKTOP` folder, including sub directories and files.", + "type": "string", + "enum": [ + "fs:scope-desktop-recursive" + ] + }, + { + "description": "fs:scope-document -> This scope permits access to all files and list content of top level directories in the `$DOCUMENT`folder.", + "type": "string", + "enum": [ + "fs:scope-document" + ] + }, + { + "description": "fs:scope-document-index -> This scope permits to list all files and folders in the `$DOCUMENT`folder.", + "type": "string", + "enum": [ + "fs:scope-document-index" + ] + }, + { + "description": "fs:scope-document-recursive -> This scope permits recursive access to the complete `$DOCUMENT` folder, including sub directories and files.", + "type": "string", + "enum": [ + "fs:scope-document-recursive" + ] + }, + { + "description": "fs:scope-download -> This scope permits access to all files and list content of top level directories in the `$DOWNLOAD`folder.", + "type": "string", + "enum": [ + "fs:scope-download" + ] + }, + { + "description": "fs:scope-download-index -> This scope permits to list all files and folders in the `$DOWNLOAD`folder.", + "type": "string", + "enum": [ + "fs:scope-download-index" + ] + }, + { + "description": "fs:scope-download-recursive -> This scope permits recursive access to the complete `$DOWNLOAD` folder, including sub directories and files.", + "type": "string", + "enum": [ + "fs:scope-download-recursive" + ] + }, + { + "description": "fs:scope-exe -> This scope permits access to all files and list content of top level directories in the `$EXE`folder.", + "type": "string", + "enum": [ + "fs:scope-exe" + ] + }, + { + "description": "fs:scope-exe-index -> This scope permits to list all files and folders in the `$EXE`folder.", + "type": "string", + "enum": [ + "fs:scope-exe-index" + ] + }, + { + "description": "fs:scope-exe-recursive -> This scope permits recursive access to the complete `$EXE` folder, including sub directories and files.", + "type": "string", + "enum": [ + "fs:scope-exe-recursive" + ] + }, + { + "description": "fs:scope-font -> This scope permits access to all files and list content of top level directories in the `$FONT`folder.", + "type": "string", + "enum": [ + "fs:scope-font" + ] + }, + { + "description": "fs:scope-font-index -> This scope permits to list all files and folders in the `$FONT`folder.", + "type": "string", + "enum": [ + "fs:scope-font-index" + ] + }, + { + "description": "fs:scope-font-recursive -> This scope permits recursive access to the complete `$FONT` folder, including sub directories and files.", + "type": "string", + "enum": [ + "fs:scope-font-recursive" + ] + }, + { + "description": "fs:scope-home -> This scope permits access to all files and list content of top level directories in the `$HOME`folder.", + "type": "string", + "enum": [ + "fs:scope-home" + ] + }, + { + "description": "fs:scope-home-index -> This scope permits to list all files and folders in the `$HOME`folder.", + "type": "string", + "enum": [ + "fs:scope-home-index" + ] + }, + { + "description": "fs:scope-home-recursive -> This scope permits recursive access to the complete `$HOME` folder, including sub directories and files.", + "type": "string", + "enum": [ + "fs:scope-home-recursive" + ] + }, + { + "description": "fs:scope-localdata -> This scope permits access to all files and list content of top level directories in the `$LOCALDATA`folder.", + "type": "string", + "enum": [ + "fs:scope-localdata" + ] + }, + { + "description": "fs:scope-localdata-index -> This scope permits to list all files and folders in the `$LOCALDATA`folder.", + "type": "string", + "enum": [ + "fs:scope-localdata-index" + ] + }, + { + "description": "fs:scope-localdata-recursive -> This scope permits recursive access to the complete `$LOCALDATA` folder, including sub directories and files.", + "type": "string", + "enum": [ + "fs:scope-localdata-recursive" + ] + }, + { + "description": "fs:scope-log -> This scope permits access to all files and list content of top level directories in the `$LOG`folder.", + "type": "string", + "enum": [ + "fs:scope-log" + ] + }, + { + "description": "fs:scope-log-index -> This scope permits to list all files and folders in the `$LOG`folder.", + "type": "string", + "enum": [ + "fs:scope-log-index" + ] + }, + { + "description": "fs:scope-log-recursive -> This scope permits recursive access to the complete `$LOG` folder, including sub directories and files.", + "type": "string", + "enum": [ + "fs:scope-log-recursive" + ] + }, + { + "description": "fs:scope-picture -> This scope permits access to all files and list content of top level directories in the `$PICTURE`folder.", + "type": "string", + "enum": [ + "fs:scope-picture" + ] + }, + { + "description": "fs:scope-picture-index -> This scope permits to list all files and folders in the `$PICTURE`folder.", + "type": "string", + "enum": [ + "fs:scope-picture-index" + ] + }, + { + "description": "fs:scope-picture-recursive -> This scope permits recursive access to the complete `$PICTURE` folder, including sub directories and files.", + "type": "string", + "enum": [ + "fs:scope-picture-recursive" + ] + }, + { + "description": "fs:scope-public -> This scope permits access to all files and list content of top level directories in the `$PUBLIC`folder.", + "type": "string", + "enum": [ + "fs:scope-public" + ] + }, + { + "description": "fs:scope-public-index -> This scope permits to list all files and folders in the `$PUBLIC`folder.", + "type": "string", + "enum": [ + "fs:scope-public-index" + ] + }, + { + "description": "fs:scope-public-recursive -> This scope permits recursive access to the complete `$PUBLIC` folder, including sub directories and files.", + "type": "string", + "enum": [ + "fs:scope-public-recursive" + ] + }, + { + "description": "fs:scope-resource -> This scope permits access to all files and list content of top level directories in the `$RESOURCE`folder.", + "type": "string", + "enum": [ + "fs:scope-resource" + ] + }, + { + "description": "fs:scope-resource-index -> This scope permits to list all files and folders in the `$RESOURCE`folder.", + "type": "string", + "enum": [ + "fs:scope-resource-index" + ] + }, + { + "description": "fs:scope-resource-recursive -> This scope permits recursive access to the complete `$RESOURCE` folder, including sub directories and files.", + "type": "string", + "enum": [ + "fs:scope-resource-recursive" + ] + }, + { + "description": "fs:scope-runtime -> This scope permits access to all files and list content of top level directories in the `$RUNTIME`folder.", + "type": "string", + "enum": [ + "fs:scope-runtime" + ] + }, + { + "description": "fs:scope-runtime-index -> This scope permits to list all files and folders in the `$RUNTIME`folder.", + "type": "string", + "enum": [ + "fs:scope-runtime-index" + ] + }, + { + "description": "fs:scope-runtime-recursive -> This scope permits recursive access to the complete `$RUNTIME` folder, including sub directories and files.", + "type": "string", + "enum": [ + "fs:scope-runtime-recursive" + ] + }, + { + "description": "fs:scope-temp -> This scope permits access to all files and list content of top level directories in the `$TEMP`folder.", + "type": "string", + "enum": [ + "fs:scope-temp" + ] + }, + { + "description": "fs:scope-temp-index -> This scope permits to list all files and folders in the `$TEMP`folder.", + "type": "string", + "enum": [ + "fs:scope-temp-index" + ] + }, + { + "description": "fs:scope-temp-recursive -> This scope permits recursive access to the complete `$TEMP` folder, including sub directories and files.", + "type": "string", + "enum": [ + "fs:scope-temp-recursive" + ] + }, + { + "description": "fs:scope-template -> This scope permits access to all files and list content of top level directories in the `$TEMPLATE`folder.", + "type": "string", + "enum": [ + "fs:scope-template" + ] + }, + { + "description": "fs:scope-template-index -> This scope permits to list all files and folders in the `$TEMPLATE`folder.", + "type": "string", + "enum": [ + "fs:scope-template-index" + ] + }, + { + "description": "fs:scope-template-recursive -> This scope permits recursive access to the complete `$TEMPLATE` folder, including sub directories and files.", + "type": "string", + "enum": [ + "fs:scope-template-recursive" + ] + }, + { + "description": "fs:scope-video -> This scope permits access to all files and list content of top level directories in the `$VIDEO`folder.", + "type": "string", + "enum": [ + "fs:scope-video" + ] + }, + { + "description": "fs:scope-video-index -> This scope permits to list all files and folders in the `$VIDEO`folder.", + "type": "string", + "enum": [ + "fs:scope-video-index" + ] + }, + { + "description": "fs:scope-video-recursive -> This scope permits recursive access to the complete `$VIDEO` folder, including sub directories and files.", + "type": "string", + "enum": [ + "fs:scope-video-recursive" + ] + }, + { + "description": "fs:write-all -> This enables all write related commands without any pre-configured accessible paths.", + "type": "string", + "enum": [ + "fs:write-all" + ] + }, + { + "description": "fs:write-files -> This enables all file write related commands without any pre-configured accessible paths.", + "type": "string", + "enum": [ + "fs:write-files" + ] + }, + { + "description": "global-shortcut:default -> No features are enabled by default, as we believe\nthe shortcuts can be inherently dangerous and it is\napplication specific if specific shortcuts should be\nregistered or unregistered.\n", + "type": "string", + "enum": [ + "global-shortcut:default" + ] + }, + { + "description": "global-shortcut:allow-is-registered -> Enables the is_registered command without any pre-configured scope.", + "type": "string", + "enum": [ + "global-shortcut:allow-is-registered" + ] + }, + { + "description": "global-shortcut:allow-register -> Enables the register command without any pre-configured scope.", + "type": "string", + "enum": [ + "global-shortcut:allow-register" + ] + }, + { + "description": "global-shortcut:allow-register-all -> Enables the register_all command without any pre-configured scope.", + "type": "string", + "enum": [ + "global-shortcut:allow-register-all" + ] + }, + { + "description": "global-shortcut:allow-unregister -> Enables the unregister command without any pre-configured scope.", + "type": "string", + "enum": [ + "global-shortcut:allow-unregister" + ] + }, + { + "description": "global-shortcut:allow-unregister-all -> Enables the unregister_all command without any pre-configured scope.", + "type": "string", + "enum": [ + "global-shortcut:allow-unregister-all" + ] + }, + { + "description": "global-shortcut:deny-is-registered -> Denies the is_registered command without any pre-configured scope.", + "type": "string", + "enum": [ + "global-shortcut:deny-is-registered" + ] + }, + { + "description": "global-shortcut:deny-register -> Denies the register command without any pre-configured scope.", + "type": "string", + "enum": [ + "global-shortcut:deny-register" + ] + }, + { + "description": "global-shortcut:deny-register-all -> Denies the register_all command without any pre-configured scope.", + "type": "string", + "enum": [ + "global-shortcut:deny-register-all" + ] + }, + { + "description": "global-shortcut:deny-unregister -> Denies the unregister command without any pre-configured scope.", + "type": "string", + "enum": [ + "global-shortcut:deny-unregister" + ] + }, + { + "description": "global-shortcut:deny-unregister-all -> Denies the unregister_all command without any pre-configured scope.", + "type": "string", + "enum": [ + "global-shortcut:deny-unregister-all" + ] + }, + { + "description": "notification:default -> This permission set configures which\nnotification features are by default exposed.\n\n#### Granted Permissions\n\nIt allows all notification related features.\n\n", + "type": "string", + "enum": [ + "notification:default" + ] + }, + { + "description": "notification:allow-batch -> Enables the batch command without any pre-configured scope.", + "type": "string", + "enum": [ + "notification:allow-batch" + ] + }, + { + "description": "notification:allow-cancel -> Enables the cancel command without any pre-configured scope.", + "type": "string", + "enum": [ + "notification:allow-cancel" + ] + }, + { + "description": "notification:allow-check-permissions -> Enables the check_permissions command without any pre-configured scope.", + "type": "string", + "enum": [ + "notification:allow-check-permissions" + ] + }, + { + "description": "notification:allow-create-channel -> Enables the create_channel command without any pre-configured scope.", + "type": "string", + "enum": [ + "notification:allow-create-channel" + ] + }, + { + "description": "notification:allow-delete-channel -> Enables the delete_channel command without any pre-configured scope.", + "type": "string", + "enum": [ + "notification:allow-delete-channel" + ] + }, + { + "description": "notification:allow-get-active -> Enables the get_active command without any pre-configured scope.", + "type": "string", + "enum": [ + "notification:allow-get-active" + ] + }, + { + "description": "notification:allow-get-pending -> Enables the get_pending command without any pre-configured scope.", + "type": "string", + "enum": [ + "notification:allow-get-pending" + ] + }, + { + "description": "notification:allow-is-permission-granted -> Enables the is_permission_granted command without any pre-configured scope.", + "type": "string", + "enum": [ + "notification:allow-is-permission-granted" + ] + }, + { + "description": "notification:allow-list-channels -> Enables the list_channels command without any pre-configured scope.", + "type": "string", + "enum": [ + "notification:allow-list-channels" + ] + }, + { + "description": "notification:allow-notify -> Enables the notify command without any pre-configured scope.", + "type": "string", + "enum": [ + "notification:allow-notify" + ] + }, + { + "description": "notification:allow-permission-state -> Enables the permission_state command without any pre-configured scope.", + "type": "string", + "enum": [ + "notification:allow-permission-state" + ] + }, + { + "description": "notification:allow-register-action-types -> Enables the register_action_types command without any pre-configured scope.", + "type": "string", + "enum": [ + "notification:allow-register-action-types" + ] + }, + { + "description": "notification:allow-register-listener -> Enables the register_listener command without any pre-configured scope.", + "type": "string", + "enum": [ + "notification:allow-register-listener" + ] + }, + { + "description": "notification:allow-remove-active -> Enables the remove_active command without any pre-configured scope.", + "type": "string", + "enum": [ + "notification:allow-remove-active" + ] + }, + { + "description": "notification:allow-request-permission -> Enables the request_permission command without any pre-configured scope.", + "type": "string", + "enum": [ + "notification:allow-request-permission" + ] + }, + { + "description": "notification:allow-show -> Enables the show command without any pre-configured scope.", + "type": "string", + "enum": [ + "notification:allow-show" + ] + }, + { + "description": "notification:deny-batch -> Denies the batch command without any pre-configured scope.", + "type": "string", + "enum": [ + "notification:deny-batch" + ] + }, + { + "description": "notification:deny-cancel -> Denies the cancel command without any pre-configured scope.", + "type": "string", + "enum": [ + "notification:deny-cancel" + ] + }, + { + "description": "notification:deny-check-permissions -> Denies the check_permissions command without any pre-configured scope.", + "type": "string", + "enum": [ + "notification:deny-check-permissions" + ] + }, + { + "description": "notification:deny-create-channel -> Denies the create_channel command without any pre-configured scope.", + "type": "string", + "enum": [ + "notification:deny-create-channel" + ] + }, + { + "description": "notification:deny-delete-channel -> Denies the delete_channel command without any pre-configured scope.", + "type": "string", + "enum": [ + "notification:deny-delete-channel" + ] + }, + { + "description": "notification:deny-get-active -> Denies the get_active command without any pre-configured scope.", + "type": "string", + "enum": [ + "notification:deny-get-active" + ] + }, + { + "description": "notification:deny-get-pending -> Denies the get_pending command without any pre-configured scope.", + "type": "string", + "enum": [ + "notification:deny-get-pending" + ] + }, + { + "description": "notification:deny-is-permission-granted -> Denies the is_permission_granted command without any pre-configured scope.", + "type": "string", + "enum": [ + "notification:deny-is-permission-granted" + ] + }, + { + "description": "notification:deny-list-channels -> Denies the list_channels command without any pre-configured scope.", + "type": "string", + "enum": [ + "notification:deny-list-channels" + ] + }, + { + "description": "notification:deny-notify -> Denies the notify command without any pre-configured scope.", + "type": "string", + "enum": [ + "notification:deny-notify" + ] + }, + { + "description": "notification:deny-permission-state -> Denies the permission_state command without any pre-configured scope.", + "type": "string", + "enum": [ + "notification:deny-permission-state" + ] + }, + { + "description": "notification:deny-register-action-types -> Denies the register_action_types command without any pre-configured scope.", + "type": "string", + "enum": [ + "notification:deny-register-action-types" + ] + }, + { + "description": "notification:deny-register-listener -> Denies the register_listener command without any pre-configured scope.", + "type": "string", + "enum": [ + "notification:deny-register-listener" + ] + }, + { + "description": "notification:deny-remove-active -> Denies the remove_active command without any pre-configured scope.", + "type": "string", + "enum": [ + "notification:deny-remove-active" + ] + }, + { + "description": "notification:deny-request-permission -> Denies the request_permission command without any pre-configured scope.", + "type": "string", + "enum": [ + "notification:deny-request-permission" + ] + }, + { + "description": "notification:deny-show -> Denies the show command without any pre-configured scope.", + "type": "string", + "enum": [ + "notification:deny-show" + ] + }, + { + "description": "os:default -> This permission set configures which\noperating system information are available\nto gather from the frontend.\n\n#### Granted Permissions\n\nAll information except the host name are available.\n\n", + "type": "string", + "enum": [ + "os:default" + ] + }, + { + "description": "os:allow-arch -> Enables the arch command without any pre-configured scope.", + "type": "string", + "enum": [ + "os:allow-arch" + ] + }, + { + "description": "os:allow-exe-extension -> Enables the exe_extension command without any pre-configured scope.", + "type": "string", + "enum": [ + "os:allow-exe-extension" + ] + }, + { + "description": "os:allow-family -> Enables the family command without any pre-configured scope.", + "type": "string", + "enum": [ + "os:allow-family" + ] + }, + { + "description": "os:allow-hostname -> Enables the hostname command without any pre-configured scope.", + "type": "string", + "enum": [ + "os:allow-hostname" + ] + }, + { + "description": "os:allow-locale -> Enables the locale command without any pre-configured scope.", + "type": "string", + "enum": [ + "os:allow-locale" + ] + }, + { + "description": "os:allow-os-type -> Enables the os_type command without any pre-configured scope.", + "type": "string", + "enum": [ + "os:allow-os-type" + ] + }, + { + "description": "os:allow-platform -> Enables the platform command without any pre-configured scope.", + "type": "string", + "enum": [ + "os:allow-platform" + ] + }, + { + "description": "os:allow-version -> Enables the version command without any pre-configured scope.", + "type": "string", + "enum": [ + "os:allow-version" + ] + }, + { + "description": "os:deny-arch -> Denies the arch command without any pre-configured scope.", + "type": "string", + "enum": [ + "os:deny-arch" + ] + }, + { + "description": "os:deny-exe-extension -> Denies the exe_extension command without any pre-configured scope.", + "type": "string", + "enum": [ + "os:deny-exe-extension" + ] + }, + { + "description": "os:deny-family -> Denies the family command without any pre-configured scope.", + "type": "string", + "enum": [ + "os:deny-family" + ] + }, + { + "description": "os:deny-hostname -> Denies the hostname command without any pre-configured scope.", + "type": "string", + "enum": [ + "os:deny-hostname" + ] + }, + { + "description": "os:deny-locale -> Denies the locale command without any pre-configured scope.", + "type": "string", + "enum": [ + "os:deny-locale" + ] + }, + { + "description": "os:deny-os-type -> Denies the os_type command without any pre-configured scope.", + "type": "string", + "enum": [ + "os:deny-os-type" + ] + }, + { + "description": "os:deny-platform -> Denies the platform command without any pre-configured scope.", + "type": "string", + "enum": [ + "os:deny-platform" + ] + }, + { + "description": "os:deny-version -> Denies the version command without any pre-configured scope.", + "type": "string", + "enum": [ + "os:deny-version" + ] + }, + { + "description": "process:default -> This permission set configures which\nprocess feeatures are by default exposed.\n\n#### Granted Permissions\n\nThis enables to quit via `allow-exit` and restart via `allow-restart`\nthe application.\n", + "type": "string", + "enum": [ + "process:default" + ] + }, + { + "description": "process:allow-exit -> Enables the exit command without any pre-configured scope.", + "type": "string", + "enum": [ + "process:allow-exit" + ] + }, + { + "description": "process:allow-restart -> Enables the restart command without any pre-configured scope.", + "type": "string", + "enum": [ + "process:allow-restart" + ] + }, + { + "description": "process:deny-exit -> Denies the exit command without any pre-configured scope.", + "type": "string", + "enum": [ + "process:deny-exit" + ] + }, + { + "description": "process:deny-restart -> Denies the restart command without any pre-configured scope.", + "type": "string", + "enum": [ + "process:deny-restart" + ] + }, + { + "description": "shell:default -> This permission set configures which\nshell functionality is exposed by default.\n\n#### Granted Permissions\n\nIt allows to use the `open` functionality without any specific\nscope pre-configured. It will allow opening `http(s)://`,\n`tel:` and `mailto:` links.\n", + "type": "string", + "enum": [ + "shell:default" + ] + }, + { + "description": "shell:allow-execute -> Enables the execute command without any pre-configured scope.", + "type": "string", + "enum": [ + "shell:allow-execute" + ] + }, + { + "description": "shell:allow-kill -> Enables the kill command without any pre-configured scope.", + "type": "string", + "enum": [ + "shell:allow-kill" + ] + }, + { + "description": "shell:allow-open -> Enables the open command without any pre-configured scope.", + "type": "string", + "enum": [ + "shell:allow-open" + ] + }, + { + "description": "shell:allow-spawn -> Enables the spawn command without any pre-configured scope.", + "type": "string", + "enum": [ + "shell:allow-spawn" + ] + }, + { + "description": "shell:allow-stdin-write -> Enables the stdin_write command without any pre-configured scope.", + "type": "string", + "enum": [ + "shell:allow-stdin-write" + ] + }, + { + "description": "shell:deny-execute -> Denies the execute command without any pre-configured scope.", + "type": "string", + "enum": [ + "shell:deny-execute" + ] + }, + { + "description": "shell:deny-kill -> Denies the kill command without any pre-configured scope.", + "type": "string", + "enum": [ + "shell:deny-kill" + ] + }, + { + "description": "shell:deny-open -> Denies the open command without any pre-configured scope.", + "type": "string", + "enum": [ + "shell:deny-open" + ] + }, + { + "description": "shell:deny-spawn -> Denies the spawn command without any pre-configured scope.", + "type": "string", + "enum": [ + "shell:deny-spawn" + ] + }, + { + "description": "shell:deny-stdin-write -> Denies the stdin_write command without any pre-configured scope.", + "type": "string", + "enum": [ + "shell:deny-stdin-write" + ] + }, + { + "description": "updater:default -> This permission set configures which kind of\nupdater functions are exposed to the frontend.\n\n#### Granted Permissions\n\nThe full workflow from checking for updates to installing them\nis enabled.\n\n", + "type": "string", + "enum": [ + "updater:default" + ] + }, + { + "description": "updater:allow-check -> Enables the check command without any pre-configured scope.", + "type": "string", + "enum": [ + "updater:allow-check" + ] + }, + { + "description": "updater:allow-download -> Enables the download command without any pre-configured scope.", + "type": "string", + "enum": [ + "updater:allow-download" + ] + }, + { + "description": "updater:allow-download-and-install -> Enables the download_and_install command without any pre-configured scope.", + "type": "string", + "enum": [ + "updater:allow-download-and-install" + ] + }, + { + "description": "updater:allow-install -> Enables the install command without any pre-configured scope.", + "type": "string", + "enum": [ + "updater:allow-install" + ] + }, + { + "description": "updater:deny-check -> Denies the check command without any pre-configured scope.", + "type": "string", + "enum": [ + "updater:deny-check" + ] + }, + { + "description": "updater:deny-download -> Denies the download command without any pre-configured scope.", + "type": "string", + "enum": [ + "updater:deny-download" + ] + }, + { + "description": "updater:deny-download-and-install -> Denies the download_and_install command without any pre-configured scope.", + "type": "string", + "enum": [ + "updater:deny-download-and-install" + ] + }, + { + "description": "updater:deny-install -> Denies the install command without any pre-configured scope.", + "type": "string", + "enum": [ + "updater:deny-install" + ] + } + ] + }, + "Value": { + "description": "All supported ACL values.", + "anyOf": [ + { + "description": "Represents a null JSON value.", + "type": "null" + }, + { + "description": "Represents a [`bool`].", + "type": "boolean" + }, + { + "description": "Represents a valid ACL [`Number`].", + "allOf": [ + { + "$ref": "#/definitions/Number" + } + ] + }, + { + "description": "Represents a [`String`].", + "type": "string" + }, + { + "description": "Represents a list of other [`Value`]s.", + "type": "array", + "items": { + "$ref": "#/definitions/Value" + } + }, + { + "description": "Represents a map of [`String`] keys to [`Value`]s.", + "type": "object", + "additionalProperties": { + "$ref": "#/definitions/Value" + } + } + ] + }, + "Number": { + "description": "A valid ACL number.", + "anyOf": [ + { + "description": "Represents an [`i64`].", + "type": "integer", + "format": "int64" + }, + { + "description": "Represents a [`f64`].", + "type": "number", + "format": "double" + } + ] + }, + "Target": { + "description": "Platform target.", + "oneOf": [ + { + "description": "MacOS.", + "type": "string", + "enum": [ + "macOS" + ] + }, + { + "description": "Windows.", + "type": "string", + "enum": [ + "windows" + ] + }, + { + "description": "Linux.", + "type": "string", + "enum": [ + "linux" + ] + }, + { + "description": "Android.", + "type": "string", + "enum": [ + "android" + ] + }, + { + "description": "iOS.", + "type": "string", + "enum": [ + "iOS" + ] + } + ] + }, + "ShellAllowedArg": { + "description": "A command argument allowed to be executed by the webview API.", + "anyOf": [ + { + "description": "A non-configurable argument that is passed to the command in the order it was specified.", + "type": "string" + }, + { + "description": "A variable that is set while calling the command from the webview API.", + "type": "object", + "required": [ + "validator" + ], + "properties": { + "raw": { + "description": "Marks the validator as a raw regex, meaning the plugin should not make any modification at runtime.\n\nThis means the regex will not match on the entire string by default, which might be exploited if your regex allow unexpected input to be considered valid. When using this option, make sure your regex is correct.", + "default": false, + "type": "boolean" + }, + "validator": { + "description": "[regex] validator to require passed values to conform to an expected input.\n\nThis will require the argument value passed to this variable to match the `validator` regex before it will be executed.\n\nThe regex string is by default surrounded by `^...$` to match the full string. For example the `https?://\\w+` regex would be registered as `^https?://\\w+$`.\n\n[regex]: ", + "type": "string" + } + }, + "additionalProperties": false + } + ] + }, + "ShellAllowedArgs": { + "description": "A set of command arguments allowed to be executed by the webview API.\n\nA value of `true` will allow any arguments to be passed to the command. `false` will disable all arguments. A list of [`ShellAllowedArg`] will set those arguments as the only valid arguments to be passed to the attached command configuration.", + "anyOf": [ + { + "description": "Use a simple boolean to allow all or disable all arguments to this command configuration.", + "type": "boolean" + }, + { + "description": "A specific set of [`ShellAllowedArg`] that are valid to call for the command configuration.", + "type": "array", + "items": { + "$ref": "#/definitions/ShellAllowedArg" + } + } + ] + } + } +} \ No newline at end of file diff --git a/clash-nyanpasu/backend/tauri/overrides/nightly.conf.json b/clash-nyanpasu/backend/tauri/overrides/nightly.conf.json index ea59b9150b..131eaba840 100644 --- a/clash-nyanpasu/backend/tauri/overrides/nightly.conf.json +++ b/clash-nyanpasu/backend/tauri/overrides/nightly.conf.json @@ -1,10 +1,9 @@ { - "$schema": "https://raw.githubusercontent.com/tauri-apps/tauri/1.x/tooling/cli/schema.json", - "package": { - "version": "1.6.2" - }, - "tauri": { + "$schema": "../../../node_modules/@tauri-apps/cli/config.schema.json", + "version": "2.0.0", + "plugins": { "updater": { + "pubkey": "dW50cnVzdGVkIGNvbW1lbnQ6IG1pbmlzaWduIHB1YmxpYyBrZXk6IDlBMUM0NjMxREZCNDRGMjYKUldRbVQ3VGZNVVljbW43N0FlWjA4UkNrbTgxSWxSSXJQcExXNkZjUTlTQkIyYkJzL0tsSWF2d0cK", "endpoints": [ "https://mirror.ghproxy.com/https://github.com/LibNyanpasu/clash-nyanpasu/releases/download/updater/update-nightly-proxy.json", "https://gh-proxy.com/https://github.com/LibNyanpasu/clash-nyanpasu/releases/download/updater/update-nightly-proxy.json", diff --git a/clash-nyanpasu/backend/tauri/src/consts.rs b/clash-nyanpasu/backend/tauri/src/consts.rs index ac37c2ba0e..4665e543a3 100644 --- a/clash-nyanpasu/backend/tauri/src/consts.rs +++ b/clash-nyanpasu/backend/tauri/src/consts.rs @@ -31,6 +31,7 @@ pub static BUILD_INFO: Lazy = Lazy::new(|| BuildInfo { pub static IS_APPIMAGE: Lazy = Lazy::new(|| std::env::var("APPIMAGE").is_ok()); +#[cfg(target_os = "windows")] pub static IS_PORTABLE: Lazy = Lazy::new(|| { if cfg!(windows) { let dir = crate::utils::dirs::app_install_dir().unwrap(); diff --git a/clash-nyanpasu/backend/tauri/src/core/clash/core.rs b/clash-nyanpasu/backend/tauri/src/core/clash/core.rs index d98428497d..44645abad3 100644 --- a/clash-nyanpasu/backend/tauri/src/core/clash/core.rs +++ b/clash-nyanpasu/backend/tauri/src/core/clash/core.rs @@ -29,7 +29,7 @@ use std::{ }, time::Duration, }; -use tauri::api::process::Command; + use tokio::time::sleep; use tracing_attributes::instrument; @@ -414,17 +414,18 @@ impl CoreManager { let app_dir = dirs::app_data_dir()?; let app_dir = dirs::path_to_str(&app_dir)?; log::debug!(target: "app", "check config in `{clash_core}`"); - let output = Command::new_sidecar(clash_core)? + let output = std::process::Command::new(dirs::get_data_or_sidecar_path(&clash_core)?) .args(["-t", "-d", app_dir, "-f", config_path]) .output()?; if !output.status.success() { - let error = api::parse_check_output(output.stdout.clone()); + let stdout = String::from_utf8_lossy(&output.stdout); + let error = api::parse_check_output(stdout.to_string()); let error = match !error.is_empty() { true => error, - false => output.stdout.clone(), + false => stdout.to_string(), }; - Logger::global().set_log(output.stdout); + Logger::global().set_log(stdout.to_string()); bail!("{error}"); } @@ -462,11 +463,12 @@ impl CoreManager { let tun_device_ip = Config::clash().clone().latest().get_tun_device_ip(); // 执行 networksetup -setdnsservers Wi-Fi $tun_device_ip - let (mut rx, _) = Command::new("networksetup") + let output = tokio::process::Command::new("networksetup") .args(["-setdnsservers", "Wi-Fi", tun_device_ip.as_str()]) - .spawn()?; - let event = rx.recv().await; - log::debug!(target: "app", "{event:?}"); + .output() + .await?; + + log::debug!(target: "app", "set system dns: {:?}", output); } } // FIXME: 重构服务模式 @@ -553,9 +555,10 @@ impl CoreManager { if enable_tun { log::debug!(target: "app", "try to set system dns"); - match Command::new("networksetup") + match tokio::process::Command::new("networksetup") .args(["-setdnsservers", "Wi-Fi", "Empty"]) .output() + .await { Ok(_) => return Ok(()), Err(err) => { diff --git a/clash-nyanpasu/backend/tauri/src/core/handle.rs b/clash-nyanpasu/backend/tauri/src/core/handle.rs index 9e87cb64b9..907ff65603 100644 --- a/clash-nyanpasu/backend/tauri/src/core/handle.rs +++ b/clash-nyanpasu/backend/tauri/src/core/handle.rs @@ -5,7 +5,7 @@ use once_cell::sync::OnceCell; use parking_lot::Mutex; use serde::{Deserialize, Serialize}; use std::sync::Arc; -use tauri::{AppHandle, Manager, Window}; +use tauri::{AppHandle, Emitter, Manager, WebviewWindow, Wry}; #[derive(Debug, Default, Clone)] pub struct Handle { pub app_handle: Arc>>, @@ -42,11 +42,11 @@ impl Handle { *self.app_handle.lock() = Some(app_handle); } - pub fn get_window(&self) -> Option { + pub fn get_window(&self) -> Option> { self.app_handle .lock() .as_ref() - .and_then(|a| a.get_window("main")) + .and_then(|a| a.get_webview_window("main")) } pub fn refresh_clash() { @@ -81,11 +81,12 @@ impl Handle { } pub fn update_systray() -> Result<()> { - let app_handle = Self::global().app_handle.lock(); - if app_handle.is_none() { - bail!("update_systray unhandled error"); - } - Tray::update_systray(app_handle.as_ref().unwrap())?; + // let app_handle = Self::global().app_handle.lock(); + // if app_handle.is_none() { + // bail!("update_systray unhandled error"); + // } + // Tray::update_systray(app_handle.as_ref().unwrap())?; + Handle::emit("update_systray", ())?; Ok(()) } @@ -98,4 +99,14 @@ impl Handle { Tray::update_part(app_handle.as_ref().unwrap())?; Ok(()) } + + pub fn emit(event: &str, payload: S) -> Result<()> { + let app_handle = Self::global().app_handle.lock(); + if app_handle.is_none() { + bail!("app_handle is not exist"); + } + + app_handle.as_ref().unwrap().emit(event, payload)?; + Ok(()) + } } diff --git a/clash-nyanpasu/backend/tauri/src/core/hotkey.rs b/clash-nyanpasu/backend/tauri/src/core/hotkey.rs index 8b4f308e1c..89600623cd 100644 --- a/clash-nyanpasu/backend/tauri/src/core/hotkey.rs +++ b/clash-nyanpasu/backend/tauri/src/core/hotkey.rs @@ -3,8 +3,9 @@ use anyhow::{bail, Result}; use once_cell::sync::OnceCell; use parking_lot::Mutex; use std::{collections::HashMap, sync::Arc}; -use tauri::{AppHandle, GlobalShortcutManager}; -use wry::application::accelerator::Accelerator; +use tauri::AppHandle; + +use tauri_plugin_global_shortcut::{GlobalShortcutExt, Shortcut}; pub struct Hotkey { current: Arc>>, // 保存当前的热键设置 @@ -64,24 +65,20 @@ impl Hotkey { fn check_key(hotkey: &str) -> Result<()> { // fix #287 // tauri的这几个方法全部有Result expect,会panic,先检测一遍避免挂了 - if hotkey.parse::().is_err() { + if hotkey.parse::().is_err() { bail!("invalid hotkey `{hotkey}`"); } Ok(()) } - fn get_manager(&self) -> Result { + fn register(&self, hotkey: &str, func: &str) -> Result<()> { let app_handle = self.app_handle.lock(); if app_handle.is_none() { - bail!("failed to get the hotkey manager"); + bail!("app handle is none"); } - Ok(app_handle.as_ref().unwrap().global_shortcut_manager()) - } + let manager = app_handle.as_ref().unwrap().global_shortcut(); - fn register(&self, hotkey: &str, func: &str) -> Result<()> { - let mut manager = self.get_manager()?; - - if manager.is_registered(hotkey)? { + if manager.is_registered(hotkey) { manager.unregister(hotkey)?; } @@ -97,17 +94,25 @@ impl Hotkey { "toggle_tun_mode" => feat::toggle_tun_mode, "enable_tun_mode" => feat::enable_tun_mode, "disable_tun_mode" => feat::disable_tun_mode, - _ => bail!("invalid function \"{func}\""), }; - manager.register(hotkey, f)?; + manager.on_shortcut(hotkey, move |_app_handle, _hotkey, _ev| { + f(); + })?; + log::info!(target: "app", "register hotkey {hotkey} {func}"); Ok(()) } fn unregister(&self, hotkey: &str) -> Result<()> { - self.get_manager()?.unregister(hotkey)?; + let app_handle = self.app_handle.lock(); + if app_handle.is_none() { + bail!("app handle is none"); + } + let manager = app_handle.as_ref().unwrap().global_shortcut(); + + manager.unregister(hotkey)?; log::info!(target: "app", "unregister hotkey {hotkey}"); Ok(()) } @@ -189,8 +194,12 @@ impl Hotkey { impl Drop for Hotkey { fn drop(&mut self) { - if let Ok(mut manager) = self.get_manager() { - let _ = manager.unregister_all(); + let app_handle = self.app_handle.lock(); + if let Some(app_handle) = app_handle.as_ref() { + let manager = app_handle.global_shortcut(); + if let Ok(()) = manager.unregister_all() { + log::info!(target: "app", "unregister all hotkeys"); + } } } } diff --git a/clash-nyanpasu/backend/tauri/src/core/service/control.rs b/clash-nyanpasu/backend/tauri/src/core/service/control.rs index 6b3d9df83f..ab57e3360b 100644 --- a/clash-nyanpasu/backend/tauri/src/core/service/control.rs +++ b/clash-nyanpasu/backend/tauri/src/core/service/control.rs @@ -216,6 +216,7 @@ pub async fn restart_service() -> anyhow::Result<()> { Ok(()) } +#[tracing::instrument] pub async fn status<'a>() -> anyhow::Result> { let mut cmd = tokio::process::Command::new(SERVICE_PATH.as_path()); cmd.args(["status", "--json"]); @@ -239,6 +240,6 @@ pub async fn status<'a>() -> anyhow::Result> ); } let mut status = String::from_utf8(output.stdout)?; - tracing::debug!("service status: {}", status); + tracing::trace!("service status: {}", status); Ok(unsafe { simd_json::serde::from_str(&mut status)? }) } diff --git a/clash-nyanpasu/backend/tauri/src/core/tray/mod.rs b/clash-nyanpasu/backend/tauri/src/core/tray/mod.rs index c01f97f9b4..93008d47a0 100644 --- a/clash-nyanpasu/backend/tauri/src/core/tray/mod.rs +++ b/clash-nyanpasu/backend/tauri/src/core/tray/mod.rs @@ -1,13 +1,18 @@ +use std::{borrow::Cow, sync::atomic::AtomicU16}; + use crate::{ config::{nyanpasu::ClashCore, Config}, - feat, ipc, + feat, ipc, log_err, utils::{help, resolve}, }; use anyhow::Result; +use once_cell::sync::Lazy; +use parking_lot::Mutex; use rust_i18n::t; use tauri::{ - AppHandle, CustomMenuItem, SystemTrayEvent, SystemTrayMenu, SystemTrayMenuItem, - SystemTraySubmenu, + menu::{Menu, MenuBuilder, MenuEvent, MenuItemBuilder, SubmenuBuilder}, + tray::{MouseButton, TrayIcon, TrayIconBuilder, TrayIconEvent}, + AppHandle, Manager, Runtime, }; use tracing_attributes::instrument; @@ -15,12 +20,130 @@ pub mod icon; pub mod proxies; pub use self::icon::on_scale_factor_changed; use self::proxies::SystemTrayMenuProxiesExt; -mod utils; + +struct TrayState { + menu: Mutex>, +} + pub struct Tray {} +static UPDATE_SYSTRAY_MUTEX: Lazy> = + Lazy::new(|| parking_lot::Mutex::new(())); + +const TRAY_ID: &str = "main-tray"; + +#[cfg(target_os = "linux")] +static LINUX_TRAY_ID: AtomicU16 = AtomicU16::new(0); +// #[cfg(target_os = "linux")] +// fn bump_tray_id() -> Cow<'static, str> { +// let id = LINUX_TRAY_ID.fetch_add(1, std::sync::atomic::Ordering::Release) + 1; +// Cow::Owned(format!("{}-{}", TRAY_ID, id)) +// } + +#[inline] +fn get_tray_id<'n>() -> Cow<'n, str> { + #[cfg(target_os = "linux")] + { + let id = LINUX_TRAY_ID.load(std::sync::atomic::Ordering::Acquire); + Cow::Owned(format!("{}-{}", TRAY_ID, id)) + } + #[cfg(not(target_os = "linux"))] + { + Cow::Borrowed(TRAY_ID) + } +} + +// fn dummy_print_submenu(submenu: &Submenu) { +// for item in submenu.items().unwrap() { +// tracing::debug!("item: {:#?}", item.id()); +// match item { +// tauri::menu::MenuItemKind::MenuItem(item) => { +// tracing::debug!( +// "item: {:#?}, type: MenuItem, text: {:#?}", +// item.id(), +// item.text() +// ); +// } +// tauri::menu::MenuItemKind::Submenu(submenu) => { +// tracing::debug!( +// "item: {:#?}, type: Submenu, text: {:#?}", +// submenu.id(), +// submenu.text() +// ); +// dummy_print_submenu(&submenu); +// } +// tauri::menu::MenuItemKind::Predefined(item) => { +// tracing::debug!( +// "item: {:#?}, type: Predefined, text: {:#?}", +// item.id(), +// item.text() +// ); +// } +// tauri::menu::MenuItemKind::Check(item) => { +// tracing::debug!( +// "item: {:#?}, type: Check, text: {:#?}", +// item.id(), +// item.text() +// ); +// } +// tauri::menu::MenuItemKind::Icon(item) => { +// tracing::debug!( +// "item: {:#?}, type: Icon, text: {:#?}", +// item.id(), +// item.text() +// ); +// } +// } +// } +// } + +// fn dummy_print_menu(menu: &Menu) { +// for item in menu.items().unwrap() { +// tracing::debug!("item: {:#?}", item.id()); +// match item { +// tauri::menu::MenuItemKind::MenuItem(item) => { +// tracing::debug!( +// "item: {:#?}, type: MenuItem, text: {:#?}", +// item.id(), +// item.text() +// ); +// } +// tauri::menu::MenuItemKind::Submenu(submenu) => { +// tracing::debug!( +// "item: {:#?}, type: Submenu, text: {:#?}", +// submenu.id(), +// submenu.text() +// ); +// dummy_print_submenu(&submenu); +// } +// tauri::menu::MenuItemKind::Predefined(item) => { +// tracing::debug!( +// "item: {:#?}, type: Predefined, text: {:#?}", +// item.id(), +// item.text() +// ); +// } +// tauri::menu::MenuItemKind::Check(item) => { +// tracing::debug!( +// "item: {:#?}, type: Check, text: {:#?}", +// item.id(), +// item.text() +// ); +// } +// tauri::menu::MenuItemKind::Icon(item) => { +// tracing::debug!( +// "item: {:#?}, type: Icon, text: {:#?}", +// item.id(), +// item.text() +// ); +// } +// } +// } +// } + impl Tray { - #[instrument(skip(_app_handle))] - pub fn tray_menu(_app_handle: &AppHandle) -> SystemTrayMenu { + #[instrument(skip(app_handle))] + pub fn tray_menu(app_handle: &AppHandle) -> Result> { let version = env!("NYANPASU_VERSION"); let core = { *Config::verge() @@ -29,72 +152,147 @@ impl Tray { .as_ref() .unwrap_or(&ClashCore::default()) }; - let mut menu = SystemTrayMenu::new() - .add_item(CustomMenuItem::new("open_window", t!("tray.dashboard"))) - .setup_proxies() // Setup the proxies menu - .add_native_item(SystemTrayMenuItem::Separator) - .add_item(CustomMenuItem::new("rule_mode", t!("tray.rule_mode"))) - .add_item(CustomMenuItem::new("global_mode", t!("tray.global_mode"))) - .add_item(CustomMenuItem::new("direct_mode", t!("tray.direct_mode"))); + let mut menu = MenuBuilder::new(app_handle) + .text("open_window", t!("tray.dashboard")) + .setup_proxies(app_handle)? // Setup the proxies menu + .separator() + .check("rule_mode", t!("tray.rule_mode")) + .check("global_mode", t!("tray.global_mode")) + .check("direct_mode", t!("tray.direct_mode")); if core == ClashCore::ClashPremium { - menu = menu.add_item(CustomMenuItem::new("script_mode", t!("tray.script_mode"))) + menu = menu.check("script_mode", t!("tray.script_mode")); } - menu.add_native_item(SystemTrayMenuItem::Separator) - .add_item(CustomMenuItem::new("system_proxy", t!("tray.system_proxy"))) - .add_item(CustomMenuItem::new("tun_mode", t!("tray.tun_mode"))) - .add_item(CustomMenuItem::new("copy_env_sh", t!("tray.copy_env.sh"))) - .add_item(CustomMenuItem::new("copy_env_cmd", t!("tray.copy_env.cmd"))) - .add_item(CustomMenuItem::new("copy_env_ps", t!("tray.copy_env.ps"))) - .add_submenu(SystemTraySubmenu::new( - t!("tray.open_dir.menu"), - SystemTrayMenu::new() - .add_item(CustomMenuItem::new( - "open_app_config_dir", - t!("tray.open_dir.app_config_dir"), - )) - .add_item(CustomMenuItem::new( - "open_app_data_dir", - t!("tray.open_dir.app_data_dir"), - )) - .add_item(CustomMenuItem::new( - "open_core_dir", - t!("tray.open_dir.core_dir"), - )) - .add_item(CustomMenuItem::new( - "open_logs_dir", - t!("tray.open_dir.log_dir"), - )), - )) - .add_submenu(SystemTraySubmenu::new( - t!("tray.more.menu"), - SystemTrayMenu::new() - .add_item(CustomMenuItem::new( - "restart_clash", - t!("tray.more.restart_clash"), - )) - .add_item(CustomMenuItem::new( - "restart_app", - t!("tray.more.restart_app"), - )) - .add_item( - CustomMenuItem::new("app_version", format!("Version {version}")).disabled(), - ), - )) - .add_native_item(SystemTrayMenuItem::Separator) - .add_item(CustomMenuItem::new("quit", t!("tray.quit")).accelerator("CmdOrControl+Q")) + menu = menu + .separator() + .check("system_proxy", t!("tray.system_proxy")) + .check("tun_mode", t!("tray.tun_mode")) + .separator() + .text("copy_env_sh", t!("tray.copy_env.sh")) + .text("copy_env_cmd", t!("tray.copy_env.cmd")) + .text("copy_env_ps", t!("tray.copy_env.ps")) + .item( + &SubmenuBuilder::new(app_handle, t!("tray.open_dir.menu")) + .text("open_app_config_dir", t!("tray.open_dir.app_config_dir")) + .text("open_app_data_dir", t!("tray.open_dir.app_data_dir")) + .text("open_core_dir", t!("tray.open_dir.core_dir")) + .text("open_logs_dir", t!("tray.open_dir.log_dir")) + .build()?, + ) + .item( + &SubmenuBuilder::new(app_handle, t!("tray.more.menu")) + .text("restart_clash", t!("tray.more.restart_clash")) + .text("restart_app", t!("tray.more.restart_app")) + .item( + &MenuItemBuilder::new(format!("Version {}", version)) + .id("app_version") + .enabled(false) + .build(app_handle)?, + ) + .build()?, + ) + .separator() + .item( + &MenuItemBuilder::new(t!("tray.quit")) + .id("quit") + .accelerator("CmdOrControl+Q") + .build(app_handle)?, + ); + + Ok(menu.build()?) } #[instrument(skip(app_handle))] - pub fn update_systray(app_handle: &AppHandle) -> Result<()> { - app_handle - .tray_handle() - .set_menu(Tray::tray_menu(app_handle))?; + pub fn update_systray(app_handle: &AppHandle) -> Result<()> { + let _guard = UPDATE_SYSTRAY_MUTEX.lock(); + let tray_id = get_tray_id(); + let tray = { + // if cfg!(target_os = "linux") { + // tracing::debug!("removing tray by id: {}", tray_id); + // let mut tray = app_handle.remove_tray_by_id(tray_id.as_ref()); + // tray.take(); // Drop the tray + // tray_id = bump_tray_id(); + // tracing::debug!("bumped tray id to: {}", tray_id); + // } + app_handle.tray_by_id(tray_id.as_ref()) + }; + + let menu = Tray::tray_menu(app_handle)?; + let tray = match tray { + None => { + let mut builder = TrayIconBuilder::with_id(tray_id); + #[cfg(any(windows, target_os = "linux"))] + { + builder = builder.icon(tauri::image::Image::from_bytes(&icon::get_icon( + &icon::TrayIcon::Normal, + ))?); + } + #[cfg(target_os = "macos")] + { + builder = builder + .icon(tauri::image::Image::from_bytes(include_bytes!( + "../../../icons/tray-icon.png" + ))?) + .icon_as_template(true); + } + builder + .menu(&menu) + .on_menu_event(|app, event| { + Tray::on_menu_item_event(app, event); + }) + .on_tray_icon_event(|tray_icon, event| { + Tray::on_system_tray_event(tray_icon, event); + }) + .build(app_handle)? + } + Some(tray) => { + // This is a workaround for linux tray menu update. Due to the api disallow set_menu again + // and recreate tray icon will cause buggy tray. No icon and no menu. + // So this block is a dirty inheritance of the menu items from the previous tray menu. + if cfg!(target_os = "linux") { + let state = app_handle.state::>(); + let previous_menu = state.menu.lock(); + if let Ok(items) = previous_menu.items() { + tracing::debug!("removing previous tray menu items"); + for item in items { + log_err!(previous_menu.remove(&item), "failed to remove menu item"); + } + } + // migrate the menu items + if let Ok(items) = menu.items() { + tracing::debug!("migrating new tray menu items"); + for item in items { + log_err!(previous_menu.append(&item), "failed to append menu item"); + } + } + } else { + tray.set_menu(Some(menu.clone()))?; + } + tray + } + }; + tray.set_visible(true)?; + { + match app_handle.try_state::>() { + Some(state) if cfg!(not(target_os = "linux")) => { + tracing::debug!("replacing previous tray menu"); + *state.menu.lock() = menu; + } + None => { + tracing::debug!("creating new tray menu"); + app_handle.manage(TrayState { + menu: Mutex::new(menu), + }); + } + _ => {} + } + } + tracing::debug!("full update tray finished"); Tray::update_part(app_handle)?; Ok(()) } #[instrument(skip(app_handle))] - pub fn update_part(app_handle: &AppHandle) -> Result<()> { + pub fn update_part(app_handle: &AppHandle) -> Result<()> { let mode = crate::utils::config::get_current_clash_mode(); let core = { *Config::verge() @@ -103,54 +301,25 @@ impl Tray { .as_ref() .unwrap_or(&ClashCore::default()) }; - let tray = app_handle.tray_handle(); + let tray_id = get_tray_id(); + tracing::debug!("updating tray part: {}", tray_id); + let tray = app_handle.tray_by_id(tray_id.as_ref()).unwrap(); + let state = app_handle.state::>(); + let menu = state.menu.lock(); - #[cfg(target_os = "linux")] - { - let _ = tray.get_item("rule_mode").set_title(t!("tray.rule_mode")); - let _ = tray - .get_item("global_mode") - .set_title(t!("tray.global_mode")); - let _ = tray - .get_item("direct_mode") - .set_title(t!("tray.direct_mode")); - if core == ClashCore::ClashPremium { - let _ = tray - .get_item("script_mode") - .set_title(t!("tray.script_mode")); - } - match mode.as_str() { - "rule" => { - let _ = tray - .get_item("rule_mode") - .set_title(utils::selected_title(t!("tray.rule_mode"))); - } - "global" => { - let _ = tray - .get_item("global_mode") - .set_title(utils::selected_title(t!("tray.global_mode"))); - } - "direct" => { - let _ = tray - .get_item("direct_mode") - .set_title(utils::selected_title(t!("tray.direct_mode"))); - } - "script" => { - let _ = tray - .get_item("script_mode") - .set_title(utils::selected_title(t!("tray.script_mode"))); - } - _ => {} - } - } - #[cfg(not(target_os = "linux"))] - { - let _ = tray.get_item("rule_mode").set_selected(mode == "rule"); - let _ = tray.get_item("global_mode").set_selected(mode == "global"); - let _ = tray.get_item("direct_mode").set_selected(mode == "direct"); - if core == ClashCore::ClashPremium { - let _ = tray.get_item("script_mode").set_selected(mode == "script"); - } + let _ = menu + .get("rule_mode") + .and_then(|item| item.as_check_menuitem()?.set_checked(mode == "rule").ok()); + let _ = menu + .get("global_mode") + .and_then(|item| item.as_check_menuitem()?.set_checked(mode == "global").ok()); + let _ = menu + .get("direct_mode") + .and_then(|item| item.as_check_menuitem()?.set_checked(mode == "direct").ok()); + if core == ClashCore::ClashPremium { + let _ = menu + .get("script_mode") + .and_then(|item| item.as_check_menuitem()?.set_checked(mode == "script").ok()); } let (system_proxy, tun_mode) = { @@ -162,7 +331,7 @@ impl Tray { ) }; - #[cfg(target_os = "windows")] + #[cfg(any(target_os = "windows", target_os = "linux"))] { use icon::TrayIcon; @@ -174,98 +343,86 @@ impl Tray { TrayIcon::Normal }; let icon = icon::get_icon(&mode); - let _ = tray.set_icon(tauri::Icon::Raw(icon)); + let _ = tray.set_icon(Some(tauri::image::Image::from_bytes(&icon)?)); } - #[cfg(target_os = "linux")] - { - match system_proxy { - true => { - let _ = tray - .get_item("system_proxy") - .set_title(utils::selected_title(t!("tray.system_proxy"))); - } - false => { - let _ = tray - .get_item("system_proxy") - .set_title(t!("tray.system_proxy")); - } - } + let _ = menu + .get("system_proxy") + .and_then(|item| item.as_check_menuitem()?.set_checked(system_proxy).ok()); + let _ = menu + .get("tun_mode") + .and_then(|item| item.as_check_menuitem()?.set_checked(tun_mode).ok()); - match tun_mode { - true => { - let _ = tray - .get_item("tun_mode") - .set_title(utils::selected_title(t!("tray.tun_mode"))); - } - false => { - let _ = tray.get_item("tun_mode").set_title(t!("tray.tun_mode")); - } - } - } + let switch_map = { + let mut map = std::collections::HashMap::new(); + map.insert(true, t!("tray.proxy_action.on")); + map.insert(false, t!("tray.proxy_action.off")); + map + }; #[cfg(not(target_os = "linux"))] { - let _ = tray.get_item("system_proxy").set_selected(system_proxy); - let _ = tray.get_item("tun_mode").set_selected(tun_mode); - } - - #[cfg(not(target_os = "linux"))] - { - let switch_map = { - let mut map = std::collections::HashMap::new(); - map.insert(true, t!("tray.proxy_action.on")); - map.insert(false, t!("tray.proxy_action.off")); - map - }; - - let _ = tray.set_tooltip(&format!( + let _ = tray.set_tooltip(Some(&format!( "{}: {}\n{}: {}", t!("tray.system_proxy"), switch_map[&system_proxy], t!("tray.tun_mode"), switch_map[&tun_mode] - )); + ))); + } + #[cfg(target_os = "linux")] + { + let _ = tray.set_title(Some(&format!( + "{}: {}\n{}: {}", + t!("tray.system_proxy"), + switch_map[&system_proxy], + t!("tray.tun_mode"), + switch_map[&tun_mode] + ))); } Ok(()) } #[instrument(skip(app_handle, event))] - pub fn on_system_tray_event(app_handle: &AppHandle, event: SystemTrayEvent) { - match event { - SystemTrayEvent::MenuItemClick { id, .. } => match id.as_str() { - mode @ ("rule_mode" | "global_mode" | "direct_mode" | "script_mode") => { - let mode = &mode[0..mode.len() - 5]; - feat::change_clash_mode(mode.into()); - } - - "open_window" => resolve::create_window(app_handle), - "system_proxy" => feat::toggle_system_proxy(), - "tun_mode" => feat::toggle_tun_mode(), - "copy_env_sh" => feat::copy_clash_env("sh"), - #[cfg(target_os = "windows")] - "copy_env_cmd" => feat::copy_clash_env("cmd"), - #[cfg(target_os = "windows")] - "copy_env_ps" => feat::copy_clash_env("ps"), - "open_app_config_dir" => crate::log_err!(ipc::open_app_config_dir()), - "open_app_data_dir" => crate::log_err!(ipc::open_app_data_dir()), - "open_core_dir" => crate::log_err!(ipc::open_core_dir()), - "open_logs_dir" => crate::log_err!(ipc::open_logs_dir()), - "restart_clash" => feat::restart_clash_core(), - "restart_app" => help::restart_application(app_handle), - "quit" => { - help::quit_application(app_handle); - } - _ => { - proxies::on_system_tray_event(&id); - } - }, - #[cfg(target_os = "windows")] - SystemTrayEvent::LeftClick { .. } => { - resolve::create_window(app_handle); + pub fn on_menu_item_event(app_handle: &AppHandle, event: MenuEvent) { + let id = event.id().0.as_str(); + match id { + mode @ ("rule_mode" | "global_mode" | "direct_mode" | "script_mode") => { + let mode = &mode[0..mode.len() - 5]; + feat::change_clash_mode(mode.into()); } - _ => {} + + "open_window" => resolve::create_window(app_handle), + "system_proxy" => feat::toggle_system_proxy(), + "tun_mode" => feat::toggle_tun_mode(), + "copy_env_sh" => feat::copy_clash_env(app_handle, "sh"), + #[cfg(target_os = "windows")] + "copy_env_cmd" => feat::copy_clash_env(app_handle, "cmd"), + #[cfg(target_os = "windows")] + "copy_env_ps" => feat::copy_clash_env(app_handle, "ps"), + "open_app_config_dir" => crate::log_err!(ipc::open_app_config_dir()), + "open_app_data_dir" => crate::log_err!(ipc::open_app_data_dir()), + "open_core_dir" => crate::log_err!(ipc::open_core_dir()), + "open_logs_dir" => crate::log_err!(ipc::open_logs_dir()), + "restart_clash" => feat::restart_clash_core(), + "restart_app" => help::restart_application(app_handle), + "quit" => { + help::quit_application(app_handle); + } + _ => { + proxies::on_system_tray_event(id); + } + } + } + + pub fn on_system_tray_event(tray_icon: &TrayIcon, event: TrayIconEvent) { + if let TrayIconEvent::Click { + button: MouseButton::Left, + .. + } = event + { + resolve::create_window(tray_icon.app_handle()); } } } diff --git a/clash-nyanpasu/backend/tauri/src/core/tray/proxies.rs b/clash-nyanpasu/backend/tauri/src/core/tray/proxies.rs index a29fcd162a..e4d37fc46a 100644 --- a/clash-nyanpasu/backend/tauri/src/core/tray/proxies.rs +++ b/clash-nyanpasu/backend/tauri/src/core/tray/proxies.rs @@ -6,9 +6,8 @@ use crate::{ }, }; use anyhow::Context; -use base64::{engine::general_purpose::STANDARD as base64_standard, Engine as _}; use indexmap::IndexMap; -use tauri::SystemTrayMenu; +use tauri::{menu::MenuBuilder, AppHandle, Manager, Runtime}; use tracing::{debug, error, warn}; use tracing_attributes::instrument; @@ -41,8 +40,9 @@ async fn loop_task() { } type GroupName = String; -type FromProxy = String; -type ToProxy = String; +type ProxyName = String; +type FromProxy = ProxyName; +type ToProxy = ProxyName; type ProxySelectAction = (GroupName, FromProxy, ToProxy); #[derive(PartialEq)] enum TrayUpdateType { @@ -179,8 +179,9 @@ pub async fn proxies_updated_receiver() { match diff_proxies(&tray_proxies_holder, ¤t_tray_proxies) { TrayUpdateType::Full => { debug!("should do full update"); + tray_proxies_holder = current_tray_proxies; - match Handle::update_systray() { + match Handle::emit("update_systray", ()) { Ok(_) => { debug!("update systray success"); } @@ -211,91 +212,129 @@ pub fn setup_proxies() { } mod platform_impl { - use std::sync::atomic::AtomicBool; - - use super::{ProxySelectAction, TrayProxyItem}; + use super::{GroupName, ProxyName, ProxySelectAction, TrayProxyItem}; use crate::{ config::nyanpasu::ProxiesSelectorMode, core::{clash::proxies::ProxiesGuard, handle::Handle}, }; - use base64::{engine::general_purpose::STANDARD as base64_standard, Engine as _}; + use bimap::BiMap; + use once_cell::sync::Lazy; + use parking_lot::Mutex; use rust_i18n::t; - use tauri::{CustomMenuItem, SystemTrayMenu, SystemTrayMenuItem, SystemTraySubmenu}; + use std::sync::atomic::AtomicBool; + use tauri::{ + menu::{ + CheckMenuItemBuilder, IsMenuItem, Menu, MenuBuilder, MenuItemBuilder, MenuItemKind, + Submenu, SubmenuBuilder, + }, + AppHandle, Manager, Runtime, + }; use tracing::warn; - pub fn generate_group_selector(group_name: &str, group: &TrayProxyItem) -> SystemTraySubmenu { - let mut group_menu = SystemTrayMenu::new(); - for item in group.all.iter() { - let mut sub_item = CustomMenuItem::new( - format!( - "select_proxy_{}_{}", - base64_standard.encode(group_name), - base64_standard.encode(item) - ), - item.clone(), + // It store a map of proxy nodes like "GROUP_PROXY" -> ID + // TODO: use Cow instead of String + pub(super) static ITEM_IDS: Lazy>> = + Lazy::new(|| Mutex::new(BiMap::new())); + + pub fn generate_group_selector( + app_handle: &AppHandle, + group_name: &str, + group: &TrayProxyItem, + ) -> anyhow::Result> { + let mut item_ids = ITEM_IDS.lock(); + let mut group_menu = SubmenuBuilder::new(app_handle, group_name); + if group.all.is_empty() { + group_menu = group_menu.item( + &MenuItemBuilder::new(t!("tray.no_proxies")) + .enabled(false) + .build(app_handle)?, ); + return Ok(group_menu.build()?); + } + for item in group.all.iter() { + let key = (group_name.to_string(), item.to_string()); + let id = item_ids.len(); + item_ids.insert(key, id); + let mut sub_item_builder = CheckMenuItemBuilder::new(item.clone()) + .id(format!("proxy_node_{}", id)) + .checked(false); if let Some(now) = group.current.clone() { if now == item.as_str() { - #[cfg(target_os = "linux")] - { - sub_item.title = super::super::utils::selected_title(item); - } - #[cfg(not(target_os = "linux"))] - { - sub_item = sub_item.selected(); - } + sub_item_builder = sub_item_builder.checked(true); } } if !matches!(group.r#type.as_str(), "Selector" | "Fallback") { - sub_item = sub_item.disabled(); + sub_item_builder = sub_item_builder.enabled(false); } - group_menu = group_menu.add_item(sub_item); + group_menu = group_menu.item(&sub_item_builder.build(app_handle)?); } - SystemTraySubmenu::new(group_name.to_string(), group_menu) + Ok(group_menu.build()?) } - pub fn generate_selectors( - menu: &SystemTrayMenu, + pub fn generate_selectors( + app_handle: &AppHandle, proxies: &super::TrayProxies, - ) -> SystemTrayMenu { - let mut menu = menu.to_owned(); + ) -> anyhow::Result>> { + let mut items = Vec::new(); if proxies.is_empty() { - return menu.add_item(CustomMenuItem::new("no_proxies", "No Proxies")); + items.push(MenuItemKind::MenuItem( + MenuItemBuilder::new("No Proxies") + .id("no_proxies") + .enabled(false) + .build(app_handle)?, + )); + return Ok(items); + } + { + let mut item_ids = ITEM_IDS.lock(); + item_ids.clear(); // clear the item ids } for (group, item) in proxies.iter() { - let group_menu = generate_group_selector(group, item); - menu = menu.add_submenu(group_menu); + let group_menu = generate_group_selector(app_handle, group, item)?; + items.push(MenuItemKind::Submenu(group_menu)); } - menu + Ok(items) } - pub fn setup_tray(menu: &mut SystemTrayMenu) -> SystemTrayMenu { - let mut parent_menu = menu.to_owned(); + pub fn setup_tray<'m, R: Runtime, M: Manager>( + app_handle: &AppHandle, + mut menu: MenuBuilder<'m, R, M>, + ) -> anyhow::Result> { let selector_mode = crate::config::Config::verge() .latest() .clash_tray_selector .unwrap_or_default(); - let mut menu = match selector_mode { - ProxiesSelectorMode::Hidden => return parent_menu, - ProxiesSelectorMode::Normal => { - parent_menu = parent_menu.add_native_item(SystemTrayMenuItem::Separator); - parent_menu.clone() - } - ProxiesSelectorMode::Submenu => SystemTrayMenu::new(), + menu = match selector_mode { + ProxiesSelectorMode::Hidden => return Ok(menu), + ProxiesSelectorMode::Normal => menu.separator(), + ProxiesSelectorMode::Submenu => menu, }; let proxies = ProxiesGuard::global().read().inner().to_owned(); let mode = crate::utils::config::get_current_clash_mode(); let tray_proxies = super::to_tray_proxies(mode.as_str(), &proxies); - menu = generate_selectors(&menu, &tray_proxies); - if selector_mode == ProxiesSelectorMode::Submenu { - parent_menu = - parent_menu.add_submenu(SystemTraySubmenu::new(t!("tray.select_proxies"), menu)); - parent_menu - } else { - menu + let items = generate_selectors::(app_handle, &tray_proxies)?; + match selector_mode { + ProxiesSelectorMode::Normal => { + for item in items { + menu = menu.item(&item); + } + } + ProxiesSelectorMode::Submenu => { + let mut submenu = SubmenuBuilder::with_id( + app_handle, + "select_proxies", + t!("tray.select_proxies"), + ); + for item in items { + submenu = submenu.item(&item); + } + menu = menu.item(&submenu.build()?); + } + _ => {} } + Ok(menu) } static TRAY_ITEM_UPDATE_BARRIER: AtomicBool = AtomicBool::new(false); @@ -306,84 +345,175 @@ mod platform_impl { warn!("tray item update is in progress, skip this update"); return; } - let tray = Handle::global() - .app_handle - .lock() + let app_handle = Handle::global().app_handle.lock(); + let tray_state = app_handle .as_ref() .unwrap() - .tray_handle(); + .state::>(); TRAY_ITEM_UPDATE_BARRIER.store(true, std::sync::atomic::Ordering::Release); + let menu = tray_state.menu.lock(); + let item_ids = ITEM_IDS.lock(); for action in actions { - tracing::debug!("update selected proxies: {:?}", action); - let from = format!( - "select_proxy_{}_{}", - base64_standard.encode(&action.0), - base64_standard.encode(&action.1) - ); - let to = format!( - "select_proxy_{}_{}", - base64_standard.encode(&action.0), - base64_standard.encode(&action.2) - ); + // #[cfg(not(target_os = "linux"))] + // { + // tracing::debug!("update selected proxies: {:?}", action); + // let from_id = match item_ids.get_by_left(&(action.0.clone(), action.1.clone())) { + // Some(id) => *id, + // None => { + // warn!("from item not found: {:?}", action); + // continue; + // } + // }; + // let from_id = format!("proxy_node_{}", from_id); - match tray.try_get_item(&from) { + // let to_id = match item_ids.get_by_left(&(action.0.clone(), action.2.clone())) { + // Some(id) => *id, + // None => { + // warn!("to item not found: {:?}", action); + // continue; + // } + // }; + // let to_id = format!("proxy_node_{}", to_id); + + // match menu.get(&from_id) { + // Some(item) => match item.kind() { + // MenuItemKind::Check(item) => { + // if item.is_checked().is_ok_and(|x| x) { + // let _ = item.set_checked(false); + // } + // } + // MenuItemKind::MenuItem(item) => { + // let _ = item.set_text(action.1.clone()); + // } + // _ => { + // warn!("failed to deselect, item is not a check item: {}", from_id); + // } + // }, + // None => { + // warn!("failed to deselect, item not found: {}", from_id); + // } + // } + // match menu.get(&to_id) { + // Some(item) => match item.kind() { + // MenuItemKind::Check(item) => { + // if item.is_checked().is_ok_and(|x| !x) { + // let _ = item.set_checked(true); + // } + // } + // MenuItemKind::MenuItem(item) => { + // let _ = item.set_text(action.2.clone()); + // } + // _ => { + // warn!("failed to select, item is not a check item: {}", to_id); + // } + // }, + // None => { + // warn!("failed to select, item not found: {}", to_id); + // } + // } + // } + // } + + // here is a fucking workaround for id getter + #[inline] + fn find_check_item( + menu: &Menu, + group: GroupName, + proxy: ProxyName, + ) -> Option> { + menu.items() + .ok() + .and_then(|items| { + items.into_iter().find(|i| matches!(i, tauri::menu::MenuItemKind::Submenu(submenu) if submenu.text().is_ok_and(|text| text == group) || submenu.id() == "select_proxies")) + }) + .and_then(|submenu| { + let submenu = submenu.as_submenu_unchecked(); + if submenu.id() == "select_proxies" { + submenu.items().ok().and_then(|items| { + items.into_iter().find(|i| matches!(i, tauri::menu::MenuItemKind::Submenu(submenu) if submenu.text().is_ok_and(|text| text == group))) + }) + .and_then(|submenu| { + submenu.as_submenu_unchecked().items().ok() + }) + } else { + submenu.items().ok() + } + }) + .and_then(|items| { + items.into_iter().find(|i| matches!(i, tauri::menu::MenuItemKind::Check(item) if item.text().is_ok_and(|text| text == proxy))) + }).map(|item| item.as_check_menuitem_unchecked().clone()) + } + + let from_item = find_check_item(&menu, actions[0].0.clone(), actions[0].1.clone()); + match from_item { Some(item) => { - #[cfg(not(target_os = "linux"))] - { - let _ = item.set_selected(false); - } - #[cfg(target_os = "linux")] - { - let _ = item.set_title(action.1.clone()); - } + let _ = item.set_checked(false); } None => { - warn!("failed to deselect, item not found: {}", from); + warn!( + "failed to deselect, item not found: {} {}", + actions[0].0, actions[0].1 + ); } } - match tray.try_get_item(&to) { + + let to_item = find_check_item(&menu, actions[0].0.clone(), actions[0].2.clone()); + match to_item { Some(item) => { - #[cfg(not(target_os = "linux"))] - { - let _ = item.set_selected(true); - } - #[cfg(target_os = "linux")] - { - let _ = item.set_title(super::super::utils::selected_title(&action.2)); - } + let _ = item.set_checked(true); } None => { - warn!("failed to select, item not found: {}", to); + warn!( + "failed to select, item not found: {} {}", + actions[0].0, actions[0].2 + ); } } + + TRAY_ITEM_UPDATE_BARRIER.store(false, std::sync::atomic::Ordering::Release); } - TRAY_ITEM_UPDATE_BARRIER.store(false, std::sync::atomic::Ordering::Release); } } -pub trait SystemTrayMenuProxiesExt { - fn setup_proxies(&mut self) -> Self; +pub trait SystemTrayMenuProxiesExt { + fn setup_proxies(self, app_handle: &AppHandle) -> anyhow::Result + where + Self: Sized; } -impl SystemTrayMenuProxiesExt for SystemTrayMenu { - fn setup_proxies(&mut self) -> Self { - platform_impl::setup_tray(self) +impl<'m, R: Runtime, M: Manager> SystemTrayMenuProxiesExt for MenuBuilder<'m, R, M> { + fn setup_proxies(self, app_handle: &AppHandle) -> anyhow::Result { + platform_impl::setup_tray(app_handle, self) } } #[instrument] pub fn on_system_tray_event(event: &str) { - if !event.starts_with("select_proxy_") { + if !event.starts_with("proxy_node_") { return; // bypass non-select event } - let parts: Vec<&str> = event.split('_').collect(); - if parts.len() != 4 { - return; // bypass invalid event - } + let node_id = event.split('_').last().unwrap(); // safe to unwrap + let node_id = match node_id.parse::() { + Ok(id) => id, + Err(e) => { + error!("parse node id failed: {:?}", e); + return; + } + }; + + let (group, name) = { + let map = platform_impl::ITEM_IDS.lock(); + let item = map.get_by_right(&node_id); + match item { + Some((group, name)) => (group.clone(), name.clone()), + None => { + error!("node id not found: {}", node_id); + return; + } + } + }; let wrapper = move || -> anyhow::Result<()> { - let group = String::from_utf8(base64_standard.decode(parts[2])?)?; - let name = String::from_utf8(base64_standard.decode(parts[3])?)?; tracing::debug!("received select proxy event: {} {}", group, name); tauri::async_runtime::block_on(async move { ProxiesGuard::global() diff --git a/clash-nyanpasu/backend/tauri/src/core/tray/utils.rs b/clash-nyanpasu/backend/tauri/src/core/tray/utils.rs deleted file mode 100644 index ce6e0800dc..0000000000 --- a/clash-nyanpasu/backend/tauri/src/core/tray/utils.rs +++ /dev/null @@ -1,3 +0,0 @@ -pub(super) fn selected_title(s: impl AsRef) -> String { - format!("{} ✔", s.as_ref()) -} diff --git a/clash-nyanpasu/backend/tauri/src/enhance/tun.rs b/clash-nyanpasu/backend/tauri/src/enhance/tun.rs index 8fd5e26689..49901e3a6f 100644 --- a/clash-nyanpasu/backend/tauri/src/enhance/tun.rs +++ b/clash-nyanpasu/backend/tauri/src/enhance/tun.rs @@ -22,7 +22,7 @@ macro_rules! append { }; } -#[tracing::instrument] +#[tracing_attributes::instrument(skip(config))] pub fn use_tun(mut config: Mapping, enable: bool) -> Mapping { let tun_key = Value::from("tun"); let tun_val = config.get(&tun_key); diff --git a/clash-nyanpasu/backend/tauri/src/feat.rs b/clash-nyanpasu/backend/tauri/src/feat.rs index 3c8f44db47..befcd3895e 100644 --- a/clash-nyanpasu/backend/tauri/src/feat.rs +++ b/clash-nyanpasu/backend/tauri/src/feat.rs @@ -14,7 +14,8 @@ use anyhow::{bail, Result}; use handle::Message; use nyanpasu_ipc::api::status::CoreState; use serde_yaml::{Mapping, Value}; -use wry::application::clipboard::Clipboard; +use tauri::AppHandle; +use tauri_plugin_clipboard_manager::ClipboardExt; // 打开面板 #[allow(unused)] @@ -400,7 +401,7 @@ async fn update_core_config() -> Result<()> { } /// copy env variable -pub fn copy_clash_env(option: &str) { +pub fn copy_clash_env(app_handle: &AppHandle, option: &str) { let port = { Config::verge().latest().verge_mixed_port.unwrap_or(7890) }; let http_proxy = format!("http://127.0.0.1:{}", port); let socks5_proxy = format!("socks5://127.0.0.1:{}", port); @@ -410,12 +411,24 @@ pub fn copy_clash_env(option: &str) { let cmd: String = format!("set http_proxy={http_proxy} \n set https_proxy={http_proxy}"); let ps: String = format!("$env:HTTP_PROXY=\"{http_proxy}\"; $env:HTTPS_PROXY=\"{http_proxy}\""); - let mut clipboard = Clipboard::new(); + let clipboard = app_handle.clipboard(); match option { - "sh" => clipboard.write_text(sh), - "cmd" => clipboard.write_text(cmd), - "ps" => clipboard.write_text(ps), + "sh" => { + if let Err(e) = clipboard.write_text(sh) { + log::error!(target: "app", "copy_clash_env failed: {e}"); + } + } + "cmd" => { + if let Err(e) = clipboard.write_text(cmd) { + log::error!(target: "app", "copy_clash_env failed: {e}"); + } + } + "ps" => { + if let Err(e) = clipboard.write_text(ps) { + log::error!(target: "app", "copy_clash_env failed: {e}"); + } + } _ => log::error!(target: "app", "copy_clash_env: Invalid option! {option}"), } } diff --git a/clash-nyanpasu/backend/tauri/src/ipc.rs b/clash-nyanpasu/backend/tauri/src/ipc.rs index ec1793d614..9f5618a111 100644 --- a/clash-nyanpasu/backend/tauri/src/ipc.rs +++ b/clash-nyanpasu/backend/tauri/src/ipc.rs @@ -20,9 +20,10 @@ use profile::item_type::ProfileItemType; use serde_yaml::Mapping; use std::{borrow::Cow, collections::VecDeque, path::PathBuf}; use sysproxy::Sysproxy; +use tauri::AppHandle; use tray::icon::TrayIcon; -use tauri::api::dialog::FileDialogBuilder; +use tauri_plugin_dialog::{DialogExt, FileDialogBuilder}; type CmdResult = Result; @@ -339,34 +340,36 @@ pub async fn fetch_latest_core_versions() -> CmdResult { } #[tauri::command] -pub async fn get_core_version(core_type: nyanpasu::ClashCore) -> CmdResult { - match tokio::task::spawn_blocking(move || resolve::resolve_core_version(&core_type)).await { - Ok(Ok(version)) => Ok(version), - Ok(Err(err)) => Err(format!("{err}")), +pub async fn get_core_version( + app_handle: AppHandle, + core_type: nyanpasu::ClashCore, +) -> CmdResult { + match resolve::resolve_core_version(&app_handle, &core_type).await { + Ok(version) => Ok(version), Err(err) => Err(format!("{err}")), } } #[tauri::command] -pub async fn collect_logs() -> CmdResult { +pub async fn collect_logs(app_handle: AppHandle) -> CmdResult { let now = Local::now().format("%Y-%m-%d"); let fname = format!("{}-log", now); - let builder = FileDialogBuilder::new(); + let builder = FileDialogBuilder::new(app_handle.dialog().clone()); builder .add_filter("archive files", &["zip"]) .set_file_name(&fname) .set_title("Save log archive") .save_file(|file_path| match file_path { - None => (), - Some(path) => { - debug!("{:#?}", path.as_os_str()); - match candy::collect_logs(&path) { + Some(path) if path.as_path().is_some() => { + debug!("{:#?}", path); + match candy::collect_logs(path.as_path().unwrap()) { Ok(_) => (), Err(err) => { log::error!(target: "app", "{err}"); } } } + _ => (), }); Ok(()) } @@ -652,3 +655,9 @@ pub async fn get_service_install_prompt() -> CmdResult { } Ok(prompt) } + +#[tauri::command] +pub fn cleanup_processes(app_handle: AppHandle) -> CmdResult { + crate::utils::help::cleanup_processes(&app_handle); + Ok(()) +} diff --git a/clash-nyanpasu/backend/tauri/src/lib.rs b/clash-nyanpasu/backend/tauri/src/lib.rs new file mode 100644 index 0000000000..972daf57f2 --- /dev/null +++ b/clash-nyanpasu/backend/tauri/src/lib.rs @@ -0,0 +1,353 @@ +#![feature(auto_traits, negative_impls)] +#![cfg_attr( + all(not(debug_assertions), target_os = "windows"), + windows_subsystem = "windows" +)] + +#[cfg(target_os = "macos")] +#[macro_use] +extern crate cocoa; + +#[cfg(target_os = "macos")] +#[macro_use] +extern crate objc; + +mod cmds; +mod config; +mod consts; +mod core; +mod enhance; +mod feat; +mod ipc; +mod server; +mod utils; + +use crate::{ + config::Config, + core::handle::Handle, + utils::{init, resolve}, +}; +use tauri::Emitter; +use tauri_plugin_shell::ShellExt; +use utils::resolve::{is_window_opened, reset_window_open_counter}; + +rust_i18n::i18n!("../../locales"); + +#[cfg(feature = "deadlock-detection")] +fn deadlock_detection() { + use parking_lot::deadlock; + use std::{thread, time::Duration}; + use tracing::error; + thread::spawn(move || loop { + thread::sleep(Duration::from_secs(10)); + let deadlocks = deadlock::check_deadlock(); + if deadlocks.is_empty() { + continue; + } + + error!("{} deadlocks detected", deadlocks.len()); + for (i, threads) in deadlocks.iter().enumerate() { + error!("Deadlock #{}", i); + for t in threads { + error!("Thread Id {:#?}", t.thread_id()); + error!("{:#?}", t.backtrace()); + } + } + }); +} + +#[cfg_attr(mobile, tauri::mobile_entry_point)] +pub fn run() -> std::io::Result<()> { + // share the tauri async runtime to nyanpasu-utils + #[cfg(feature = "deadlock-detection")] + deadlock_detection(); + + // Should be in first place in order prevent single instance check block everything + // Custom scheme check + #[cfg(not(target_os = "macos"))] + // on macos the plugin handles this (macos doesn't use cli args for the url) + let custom_scheme = match std::env::args().nth(1) { + Some(url) => url::Url::parse(&url).ok(), + None => None, + }; + #[cfg(target_os = "macos")] + let custom_scheme: Option = None; + + if custom_scheme.is_none() { + // Parse commands + cmds::parse().unwrap(); + }; + #[cfg(feature = "verge-dev")] + tauri_plugin_deep_link::prepare("moe.elaina.clash.nyanpasu.dev"); + + #[cfg(not(feature = "verge-dev"))] + tauri_plugin_deep_link::prepare("moe.elaina.clash.nyanpasu"); + + // 单例检测 + let single_instance_result = utils::init::check_singleton(); + if single_instance_result + .as_ref() + .is_ok_and(|instance| instance.is_none()) + { + std::process::exit(0); + } + // Use system locale as default + let locale = { + let locale = utils::help::get_system_locale(); + utils::help::mapping_to_i18n_key(&locale) + }; + rust_i18n::set_locale(locale); + + if single_instance_result + .as_ref() + .is_ok_and(|instance| instance.is_some()) + { + if let Err(e) = init::run_pending_migrations() { + utils::dialog::panic_dialog( + &format!( + "Failed to finish migration event: {}\nYou can see the detailed information at migration.log in your local data dir.\nYou're supposed to submit it as the attachment of new issue.", + e, + ) + ); + std::process::exit(1); + } + } + + crate::log_err!(init::init_config()); + + // Panic Hook to show a panic dialog and save logs + let default_panic = std::panic::take_hook(); + std::panic::set_hook(Box::new(move |panic_info| { + use std::backtrace::{Backtrace, BacktraceStatus}; + let payload = panic_info.payload(); + + #[allow(clippy::manual_map)] + let payload = if let Some(s) = payload.downcast_ref::<&str>() { + Some(&**s) + } else if let Some(s) = payload.downcast_ref::() { + Some(s.as_str()) + } else { + None + }; + + let location = panic_info.location().map(|l| l.to_string()); + let (backtrace, note) = { + let backtrace = Backtrace::capture(); + let note = (backtrace.status() == BacktraceStatus::Disabled) + .then_some("run with RUST_BACKTRACE=1 environment variable to display a backtrace"); + (Some(backtrace), note) + }; + + tracing::error!( + panic.payload = payload, + panic.location = location, + panic.backtrace = backtrace.as_ref().map(tracing::field::display), + panic.note = note, + "A panic occurred", + ); + utils::dialog::panic_dialog(&format!( + "payload: {:#?}\nlocation: {:?}\nbacktrace: {:#?}\n\nnote: {:?}", + payload, location, backtrace, note + )); + + // cleanup the core manager + let task = std::thread::spawn(move || { + nyanpasu_utils::runtime::block_on(async { + let _ = crate::core::CoreManager::global().stop_core().await; + }); + }); + let _ = task.join(); + default_panic(panic_info); + })); + + let verge = { Config::verge().latest().language.clone().unwrap() }; + rust_i18n::set_locale(verge.as_str()); + + // show a dialog to print the single instance error + let _singleton = single_instance_result.unwrap().unwrap(); // hold the guard until the end of the program + + #[allow(unused_mut)] + let mut builder = tauri::Builder::default() + .plugin(tauri_plugin_os::init()) + .plugin(tauri_plugin_shell::init()) + .plugin(tauri_plugin_fs::init()) + .plugin(tauri_plugin_dialog::init()) + .plugin(tauri_plugin_clipboard_manager::init()) + .plugin(tauri_plugin_notification::init()) + .plugin(tauri_plugin_updater::Builder::new().build()) + .plugin(tauri_plugin_global_shortcut::Builder::default().build()) + .setup(|app| { + #[cfg(target_os = "macos")] + { + use tauri::menu::{MenuBuilder, SubmenuBuilder}; + let submenu = SubmenuBuilder::new(app, "Edit") + .undo() + .redo() + .copy() + .paste() + .cut() + .select_all() + .close_window() + .quit() + .build() + .unwrap(); + let menu = MenuBuilder::new(app).item(&submenu).build().unwrap(); + app.set_menu(menu).unwrap(); + } + + resolve::resolve_setup(app); + + // setup custom scheme + let handle = app.handle().clone(); + // For start new app from schema + #[cfg(not(target_os = "macos"))] + if let Some(url) = custom_scheme { + log::info!(target: "app", "started with schema"); + resolve::create_window(&handle.clone()); + while !is_window_opened() { + log::info!(target: "app", "waiting for window open"); + std::thread::sleep(std::time::Duration::from_millis(100)); + } + Handle::global() + .app_handle + .lock() + .as_ref() + .unwrap() + .emit("scheme-request-received", url.clone()) + .unwrap(); + } + // This operation should terminate the app if app is called by custom scheme and this instance is not the primary instance + log_err!(tauri_plugin_deep_link::register( + &["clash-nyanpasu", "clash"], + move |request| { + log::info!(target: "app", "scheme request received: {:?}", &request); + resolve::create_window(&handle.clone()); // create window if not exists + while !is_window_opened() { + log::info!(target: "app", "waiting for window open"); + std::thread::sleep(std::time::Duration::from_millis(100)); + } + handle.emit("scheme-request-received", request).unwrap(); + } + )); + std::thread::spawn(move || { + nyanpasu_utils::runtime::block_on(async move { + server::run(*server::SERVER_PORT) + .await + .expect("failed to start server"); + }); + }); + Ok(()) + }) + .invoke_handler(tauri::generate_handler![ + // common + ipc::get_sys_proxy, + ipc::open_app_config_dir, + ipc::open_app_data_dir, + ipc::open_logs_dir, + ipc::open_web_url, + ipc::open_core_dir, + // cmds::kill_sidecar, + ipc::restart_sidecar, + ipc::grant_permission, + // clash + ipc::get_clash_info, + ipc::get_clash_logs, + ipc::patch_clash_config, + ipc::change_clash_core, + ipc::get_runtime_config, + ipc::get_runtime_yaml, + ipc::get_runtime_exists, + ipc::get_runtime_logs, + ipc::clash_api_get_proxy_delay, + ipc::uwp::invoke_uwp_tool, + // updater + ipc::fetch_latest_core_versions, + ipc::update_core, + ipc::inspect_updater, + ipc::get_core_version, + // utils + ipc::collect_logs, + // verge + ipc::get_verge_config, + ipc::patch_verge_config, + // cmds::update_hotkeys, + // profile + ipc::get_profiles, + ipc::enhance_profiles, + ipc::patch_profiles_config, + ipc::view_profile, + ipc::patch_profile, + ipc::create_profile, + ipc::import_profile, + ipc::reorder_profile, + ipc::update_profile, + ipc::delete_profile, + ipc::read_profile_file, + ipc::save_profile_file, + ipc::save_window_size_state, + ipc::get_custom_app_dir, + ipc::set_custom_app_dir, + // service mode + ipc::service::status_service, + ipc::service::install_service, + ipc::service::uninstall_service, + ipc::service::start_service, + ipc::service::stop_service, + ipc::service::restart_service, + ipc::is_portable, + ipc::get_proxies, + ipc::select_proxy, + ipc::update_proxy_provider, + ipc::restart_application, + ipc::collect_envs, + ipc::get_server_port, + ipc::set_tray_icon, + ipc::is_tray_icon_set, + ipc::get_core_status, + ipc::url_delay_test, + ipc::get_ipsb_asn, + ipc::open_that, + ipc::is_appimage, + ipc::get_service_install_prompt, + ipc::cleanup_processes, + ]); + + let app = builder + .build(tauri::generate_context!()) + .expect("error while running tauri application"); + app.run(|app_handle, e| match e { + tauri::RunEvent::ExitRequested { api, .. } => { + api.prevent_exit(); + } + tauri::RunEvent::Exit => { + resolve::resolve_reset(); + } + tauri::RunEvent::WindowEvent { label, event, .. } => { + if label == "main" { + match event { + tauri::WindowEvent::ScaleFactorChanged { scale_factor, .. } => { + core::tray::on_scale_factor_changed(scale_factor); + } + tauri::WindowEvent::CloseRequested { .. } | tauri::WindowEvent::Destroyed => { + log::debug!(target: "app", "window close requested"); + reset_window_open_counter(); + let _ = resolve::save_window_state(app_handle, true); + #[cfg(target_os = "macos")] + unsafe { + crate::utils::dock::macos::hide_dock_icon(); + } + } + tauri::WindowEvent::Moved(_) | tauri::WindowEvent::Resized(_) => { + log::debug!(target: "app", "window moved or resized"); + std::thread::sleep(std::time::Duration::from_nanos(1)); + let _ = resolve::save_window_state(app_handle, false); + } + _ => {} + } + } + } + _ => {} + }); + + Ok(()) +} diff --git a/clash-nyanpasu/backend/tauri/src/main.rs b/clash-nyanpasu/backend/tauri/src/main.rs index c5e42e30ca..70a8f8b25e 100644 --- a/clash-nyanpasu/backend/tauri/src/main.rs +++ b/clash-nyanpasu/backend/tauri/src/main.rs @@ -1,318 +1,5 @@ -#![feature(auto_traits, negative_impls)] -#![cfg_attr( - all(not(debug_assertions), target_os = "windows"), - windows_subsystem = "windows" -)] +#![cfg_attr(not(debug_assertions), windows_subsystem = "windows")] -#[cfg(target_os = "macos")] -#[macro_use] -extern crate cocoa; - -#[cfg(target_os = "macos")] -#[macro_use] -extern crate objc; - -mod cmds; -mod config; -mod consts; -mod core; -mod enhance; -mod feat; -mod ipc; -mod server; -mod utils; - -use crate::{ - config::Config, - core::handle::Handle, - utils::{init, resolve}, -}; -use tauri::{api, Manager, SystemTray}; -use utils::resolve::{is_window_opened, reset_window_open_counter}; - -rust_i18n::i18n!("../../locales"); - -#[cfg(feature = "deadlock-detection")] -fn deadlock_detection() { - use parking_lot::deadlock; - use std::{thread, time::Duration}; - use tracing::error; - thread::spawn(move || loop { - thread::sleep(Duration::from_secs(10)); - let deadlocks = deadlock::check_deadlock(); - if deadlocks.is_empty() { - continue; - } - - error!("{} deadlocks detected", deadlocks.len()); - for (i, threads) in deadlocks.iter().enumerate() { - error!("Deadlock #{}", i); - for t in threads { - error!("Thread Id {:#?}", t.thread_id()); - error!("{:#?}", t.backtrace()); - } - } - }); -} - -fn main() -> std::io::Result<()> { - // share the tauri async runtime to nyanpasu-utils - #[cfg(feature = "deadlock-detection")] - deadlock_detection(); - - // Should be in first place in order prevent single instance check block everything - // Custom scheme check - #[cfg(not(target_os = "macos"))] - // on macos the plugin handles this (macos doesn't use cli args for the url) - let custom_scheme = match std::env::args().nth(1) { - Some(url) => url::Url::parse(&url).ok(), - None => None, - }; - #[cfg(target_os = "macos")] - let custom_scheme: Option = None; - - if custom_scheme.is_none() { - // Parse commands - cmds::parse().unwrap(); - }; - #[cfg(feature = "verge-dev")] - tauri_plugin_deep_link::prepare("moe.elaina.clash.nyanpasu.dev"); - - #[cfg(not(feature = "verge-dev"))] - tauri_plugin_deep_link::prepare("moe.elaina.clash.nyanpasu"); - - // 单例检测 - let single_instance_result = utils::init::check_singleton(); - if single_instance_result - .as_ref() - .is_ok_and(|instance| instance.is_none()) - { - std::process::exit(0); - } - // Use system locale as default - let locale = { - let locale = utils::help::get_system_locale(); - utils::help::mapping_to_i18n_key(&locale) - }; - rust_i18n::set_locale(locale); - - if single_instance_result - .as_ref() - .is_ok_and(|instance| instance.is_some()) - { - if let Err(e) = init::run_pending_migrations() { - utils::dialog::panic_dialog( - &format!( - "Failed to finish migration event: {}\nYou can see the detailed information at migration.log in your local data dir.\nYou're supposed to submit it as the attachment of new issue.", - e, - ) - ); - std::process::exit(1); - } - } - - crate::log_err!(init::init_config()); - - // Panic Hook to show a panic dialog and save logs - let default_panic = std::panic::take_hook(); - std::panic::set_hook(Box::new(move |info| { - error!(format!("panic hook: {:?}", info)); - utils::dialog::panic_dialog(&format!("{:?}", info)); - default_panic(info); - })); - - let verge = { Config::verge().latest().language.clone().unwrap() }; - rust_i18n::set_locale(verge.as_str()); - - // show a dialog to print the single instance error - let _singleton = single_instance_result.unwrap().unwrap(); // hold the guard until the end of the program - - #[allow(unused_mut)] - let mut builder = tauri::Builder::default() - .system_tray(SystemTray::new()) - .setup(|app| { - resolve::resolve_setup(app); - // setup custom scheme - let handle = app.handle().clone(); - // For start new app from schema - #[cfg(not(target_os = "macos"))] - if let Some(url) = custom_scheme { - log::info!(target: "app", "started with schema"); - resolve::create_window(&handle.clone()); - while !is_window_opened() { - log::info!(target: "app", "waiting for window open"); - std::thread::sleep(std::time::Duration::from_millis(100)); - } - Handle::global() - .app_handle - .lock() - .as_ref() - .unwrap() - .emit_all("scheme-request-received", url.clone()) - .unwrap(); - } - // This operation should terminate the app if app is called by custom scheme and this instance is not the primary instance - log_err!(tauri_plugin_deep_link::register( - &["clash-nyanpasu", "clash"], - move |request| { - log::info!(target: "app", "scheme request received: {:?}", &request); - resolve::create_window(&handle.clone()); // create window if not exists - while !is_window_opened() { - log::info!(target: "app", "waiting for window open"); - std::thread::sleep(std::time::Duration::from_millis(100)); - } - handle.emit_all("scheme-request-received", request).unwrap(); - } - )); - std::thread::spawn(move || { - nyanpasu_utils::runtime::block_on(async move { - server::run(*server::SERVER_PORT) - .await - .expect("failed to start server"); - }); - }); - Ok(()) - }) - .on_system_tray_event(core::tray::Tray::on_system_tray_event) - .invoke_handler(tauri::generate_handler![ - // common - ipc::get_sys_proxy, - ipc::open_app_config_dir, - ipc::open_app_data_dir, - ipc::open_logs_dir, - ipc::open_web_url, - ipc::open_core_dir, - // cmds::kill_sidecar, - ipc::restart_sidecar, - ipc::grant_permission, - // clash - ipc::get_clash_info, - ipc::get_clash_logs, - ipc::patch_clash_config, - ipc::change_clash_core, - ipc::get_runtime_config, - ipc::get_runtime_yaml, - ipc::get_runtime_exists, - ipc::get_runtime_logs, - ipc::clash_api_get_proxy_delay, - ipc::uwp::invoke_uwp_tool, - // updater - ipc::fetch_latest_core_versions, - ipc::update_core, - ipc::inspect_updater, - ipc::get_core_version, - // utils - ipc::collect_logs, - // verge - ipc::get_verge_config, - ipc::patch_verge_config, - // cmds::update_hotkeys, - // profile - ipc::get_profiles, - ipc::enhance_profiles, - ipc::patch_profiles_config, - ipc::view_profile, - ipc::patch_profile, - ipc::create_profile, - ipc::import_profile, - ipc::reorder_profile, - ipc::update_profile, - ipc::delete_profile, - ipc::read_profile_file, - ipc::save_profile_file, - ipc::save_window_size_state, - ipc::get_custom_app_dir, - ipc::set_custom_app_dir, - // service mode - ipc::service::status_service, - ipc::service::install_service, - ipc::service::uninstall_service, - ipc::service::start_service, - ipc::service::stop_service, - ipc::service::restart_service, - ipc::is_portable, - ipc::get_proxies, - ipc::select_proxy, - ipc::update_proxy_provider, - ipc::restart_application, - ipc::collect_envs, - ipc::get_server_port, - ipc::set_tray_icon, - ipc::is_tray_icon_set, - ipc::get_core_status, - ipc::url_delay_test, - ipc::get_ipsb_asn, - ipc::open_that, - ipc::is_appimage, - ipc::get_service_install_prompt, - ]); - - #[cfg(target_os = "macos")] - { - use tauri::{Menu, MenuItem, Submenu}; - - builder = builder.menu( - Menu::new().add_submenu(Submenu::new( - "Edit", - Menu::new() - .add_native_item(MenuItem::Undo) - .add_native_item(MenuItem::Redo) - .add_native_item(MenuItem::Copy) - .add_native_item(MenuItem::Paste) - .add_native_item(MenuItem::Cut) - .add_native_item(MenuItem::SelectAll) - .add_native_item(MenuItem::CloseWindow) - .add_native_item(MenuItem::Quit), - )), - ); - } - - let app = builder - .build(tauri::generate_context!()) - .expect("error while running tauri application"); - app.run(|app_handle, e| match e { - tauri::RunEvent::ExitRequested { api, .. } => { - api.prevent_exit(); - } - tauri::RunEvent::Exit => { - resolve::resolve_reset(); - api::process::kill_children(); - app_handle.exit(0); - } - tauri::RunEvent::Updater(tauri::UpdaterEvent::Downloaded) => { - resolve::resolve_reset(); - nyanpasu_utils::runtime::block_on(async { - if let Err(e) = crate::core::CoreManager::global().stop_core().await { - log::error!(target: "app", "failed to stop core while dispatch updater: {}", e); - } - }); - } - tauri::RunEvent::WindowEvent { label, event, .. } => { - if label == "main" { - match event { - tauri::WindowEvent::ScaleFactorChanged { scale_factor, .. } => { - core::tray::on_scale_factor_changed(scale_factor); - } - tauri::WindowEvent::CloseRequested { .. } | tauri::WindowEvent::Destroyed => { - // log::info!(target: "app", "window close requested"); - reset_window_open_counter(); - let _ = resolve::save_window_state(app_handle, true); - #[cfg(target_os = "macos")] - unsafe { - crate::utils::dock::macos::hide_dock_icon(); - } - } - tauri::WindowEvent::Moved(_) | tauri::WindowEvent::Resized(_) => { - // log::info!(target: "app", "window moved or resized"); - std::thread::sleep(std::time::Duration::from_nanos(1)); - let _ = resolve::save_window_state(app_handle, false); - } - _ => {} - } - } - } - _ => {} - }); - - Ok(()) +fn main() { + app_lib::run().unwrap(); } diff --git a/clash-nyanpasu/backend/tauri/src/utils/collect.rs b/clash-nyanpasu/backend/tauri/src/utils/collect.rs index a1861a94f9..331d625f9e 100644 --- a/clash-nyanpasu/backend/tauri/src/utils/collect.rs +++ b/clash-nyanpasu/backend/tauri/src/utils/collect.rs @@ -60,8 +60,11 @@ pub fn collect_envs<'a>() -> Result, std::io::Error> { let mut core = HashMap::new(); for c in CoreType::get_supported_cores() { let name: &str = c.as_ref(); - let command = tauri::api::process::Command::new_sidecar(name) - .map_err(|e| std::io::Error::new(std::io::ErrorKind::Other, e.to_string()))?; + + let mut command = std::process::Command::new( + super::dirs::get_data_or_sidecar_path(name) + .map_err(|e| std::io::Error::new(std::io::ErrorKind::Other, e.to_string()))?, + ); let output = command .args(if matches!(c, CoreType::Clash(ClashCoreType::ClashRust)) { ["-V"] @@ -70,9 +73,10 @@ pub fn collect_envs<'a>() -> Result, std::io::Error> { }) .output() .expect("failed to execute sidecar command"); + let stdout = String::from_utf8_lossy(&output.stdout); core.insert( Cow::Borrowed(name), - Cow::Owned(output.stdout.replace("\n\n", " ").trim().to_owned()), + Cow::Owned(stdout.replace("\n\n", " ").trim().to_owned()), ); } Ok(EnvInfo { diff --git a/clash-nyanpasu/backend/tauri/src/utils/dialog.rs b/clash-nyanpasu/backend/tauri/src/utils/dialog.rs index 4102513cce..47b58e28fb 100644 --- a/clash-nyanpasu/backend/tauri/src/utils/dialog.rs +++ b/clash-nyanpasu/backend/tauri/src/utils/dialog.rs @@ -1,4 +1,4 @@ -use rfd::{MessageButtons, MessageDialog, MessageLevel}; +use rfd::{MessageButtons, MessageDialog, MessageDialogResult, MessageLevel}; use rust_i18n::t; pub fn panic_dialog(msg: &str) { @@ -12,12 +12,15 @@ pub fn panic_dialog(msg: &str) { } pub fn migrate_dialog(msg: &str) -> bool { - MessageDialog::new() - .set_level(MessageLevel::Warning) - .set_title("Clash Nyanpasu Migration") - .set_buttons(MessageButtons::YesNo) - .set_description(msg) - .show() + matches!( + MessageDialog::new() + .set_level(MessageLevel::Warning) + .set_title("Clash Nyanpasu Migration") + .set_buttons(MessageButtons::YesNo) + .set_description(msg) + .show(), + MessageDialogResult::Yes + ) } pub fn error_dialog(msg: String) { diff --git a/clash-nyanpasu/backend/tauri/src/utils/dirs.rs b/clash-nyanpasu/backend/tauri/src/utils/dirs.rs index d6816701bd..93fa78eb96 100644 --- a/clash-nyanpasu/backend/tauri/src/utils/dirs.rs +++ b/clash-nyanpasu/backend/tauri/src/utils/dirs.rs @@ -3,10 +3,7 @@ use anyhow::Result; use nyanpasu_utils::dirs::{suggest_config_dir, suggest_data_dir}; use once_cell::sync::Lazy; use std::{borrow::Cow, fs, path::PathBuf}; -use tauri::{ - api::path::{home_dir, resource_dir}, - Env, -}; +use tauri::{utils::platform::resource_dir, Env}; #[cfg(not(feature = "verge-dev"))] const PREVIOUS_APP_NAME: &str = "clash-verge"; @@ -109,7 +106,7 @@ pub fn old_app_home_dir() -> Result { #[cfg(target_os = "windows")] { if !get_portable_flag() { - Ok(home_dir() + Ok(dirs::home_dir() .ok_or(anyhow::anyhow!("failed to check old app home dir"))? .join(".config") .join(PREVIOUS_APP_NAME)) @@ -120,7 +117,7 @@ pub fn old_app_home_dir() -> Result { } #[cfg(not(target_os = "windows"))] - Ok(home_dir() + Ok(dirs::home_dir() .ok_or(anyhow::anyhow!("failed to get the app home dir"))? .join(".config") .join(PREVIOUS_APP_NAME)) @@ -133,7 +130,7 @@ pub fn old_app_home_dir() -> Result { )] pub fn app_home_dir() -> Result { if cfg!(feature = "verge-dev") { - return Ok(home_dir() + return Ok(dirs::home_dir() .ok_or(anyhow::anyhow!("failed to get the app home dir"))? .join(".config") .join(APP_NAME)); @@ -147,7 +144,7 @@ pub fn app_home_dir() -> Result { if let Some(reg_app_dir) = reg_app_dir { return Ok(reg_app_dir); } - return Ok(home_dir() + return Ok(dirs::home_dir() .ok_or(anyhow::anyhow!("failed to get app home dir"))? .join(".config") .join(APP_NAME)); @@ -156,7 +153,7 @@ pub fn app_home_dir() -> Result { } #[cfg(not(target_os = "windows"))] - Ok(home_dir() + Ok(dirs::home_dir() .ok_or(anyhow::anyhow!("failed to get the app home dir"))? .join(".config") .join(APP_NAME)) @@ -168,7 +165,7 @@ pub fn app_resources_dir() -> Result { let app_handle = handle.app_handle.lock(); if let Some(app_handle) = app_handle.as_ref() { let res_dir = resource_dir(app_handle.package_info(), &Env::default()) - .ok_or(anyhow::anyhow!("failed to get the resource dir"))? + .map_err(|_| anyhow::anyhow!("failed to get the resource dir"))? .join("resources"); return Ok(res_dir); }; @@ -315,6 +312,28 @@ fn create_dir_all(dir: &PathBuf) -> Result<(), std::io::Error> { Ok(()) } +pub fn get_data_or_sidecar_path(binary_name: impl AsRef) -> Result { + let binary_name = binary_name.as_ref(); + let data_dir = app_data_dir()?; + let path = data_dir.join(if cfg!(windows) && !binary_name.ends_with(".exe") { + format!("{}.exe", binary_name) + } else { + binary_name.to_string() + }); + if path.exists() { + return Ok(data_dir); + } + + let install_dir = app_install_dir()?; + let path = install_dir.join(if cfg!(windows) && !binary_name.ends_with(".exe") { + format!("{}.exe", binary_name) + } else { + binary_name.to_string() + }); + + Ok(path) +} + mod test { #[test] fn test_dir_placeholder() { diff --git a/clash-nyanpasu/backend/tauri/src/utils/help.rs b/clash-nyanpasu/backend/tauri/src/utils/help.rs index 3faeae10b9..8156b6e73a 100644 --- a/clash-nyanpasu/backend/tauri/src/utils/help.rs +++ b/clash-nyanpasu/backend/tauri/src/utils/help.rs @@ -15,16 +15,13 @@ use std::{ path::PathBuf, str::FromStr, }; -use tauri::{ - api::{ - process::current_binary, - shell::{open, Program}, - }, - AppHandle, Manager, -}; +use tauri::{process::current_binary, AppHandle, Manager}; +use tauri_plugin_shell::ShellExt; use tracing::{debug, warn}; use tracing_attributes::instrument; +use crate::trace_err; + /// read data from yaml as struct T pub fn read_yaml(path: &PathBuf) -> Result { if !path.exists() { @@ -105,20 +102,27 @@ pub fn open_file(app: tauri::AppHandle, path: PathBuf) -> Result<()> { #[cfg(not(target_os = "macos"))] let code = "code"; - let _ = match Program::from_str(code) { - Ok(code) => open(&app.shell_scope(), path.to_string_lossy(), Some(code)), - Err(err) => { - log::error!(target: "app", "Can't find VScode `{err}`"); - // default open - open(&app.shell_scope(), path.to_string_lossy(), None) - } - }; + let shell = app.shell(); + + trace_err!( + match which::which(code) { + Ok(_) => crate::utils::open::with(path, code), + Err(err) => { + log::error!(target: "app", "Can't find VScode `{err}`"); + // default open + shell + .open(path.to_string_lossy().to_string(), None) + .map_err(|err| std::io::Error::new(std::io::ErrorKind::Other, err)) + } + }, + "Can't open file" + ); Ok(()) } pub fn get_system_locale() -> String { - tauri::api::os::locale().unwrap_or("en-US".to_string()) + tauri_plugin_os::locale().unwrap_or("en-US".to_string()) } pub fn mapping_to_i18n_key(locale_key: &str) -> &'static str { @@ -215,10 +219,12 @@ pub fn get_max_scale_factor() -> f64 { } #[instrument(skip(app_handle))] -fn cleanup_processes(app_handle: &AppHandle) { +pub fn cleanup_processes(app_handle: &AppHandle) { let _ = super::resolve::save_window_state(app_handle, true); super::resolve::resolve_reset(); - tauri::api::process::kill_children(); + let _ = nyanpasu_utils::runtime::block_on(async move { + crate::core::CoreManager::global().stop_core().await + }); } #[instrument(skip(app_handle))] @@ -263,9 +269,9 @@ macro_rules! log_err { } }; - ($result: expr, $err_str: expr) => { - if let Err(_) = $result { - log::error!(target: "app", "{}", $err_str); + ($result: expr, $label: expr) => { + if let Err(err) = $result { + log::error!(target: "app", "{}: {:#?}", $label, err); } }; } diff --git a/clash-nyanpasu/backend/tauri/src/utils/open.rs b/clash-nyanpasu/backend/tauri/src/utils/open.rs index 84c7e3472b..3cb3d609ed 100644 --- a/clash-nyanpasu/backend/tauri/src/utils/open.rs +++ b/clash-nyanpasu/backend/tauri/src/utils/open.rs @@ -12,3 +12,16 @@ pub fn that>(path: T) -> std::io::Result<()> { open::that(path) } } + +pub fn with>(path: T, program: &str) -> std::io::Result<()> { + // A dirty workaround for AppImage + if std::env::var("APPIMAGE").is_ok() { + std::process::Command::new(program) + .arg(path) + .env_remove("LD_LIBRARY_PATH") + .status()?; + Ok(()) + } else { + open::with(path, program) + } +} diff --git a/clash-nyanpasu/backend/tauri/src/utils/resolve.rs b/clash-nyanpasu/backend/tauri/src/utils/resolve.rs index 5922e9832d..b8db7d3819 100644 --- a/clash-nyanpasu/backend/tauri/src/utils/resolve.rs +++ b/clash-nyanpasu/backend/tauri/src/utils/resolve.rs @@ -18,7 +18,8 @@ use std::{ net::TcpListener, sync::atomic::{AtomicU16, Ordering}, }; -use tauri::{api::process::Command, async_runtime::block_on, App, AppHandle, Manager}; +use tauri::{async_runtime::block_on, App, AppHandle, Emitter, Listener, Manager}; +use tauri_plugin_shell::ShellExt; static OPEN_WINDOWS_COUNTER: AtomicU16 = AtomicU16::new(0); @@ -85,7 +86,7 @@ pub fn find_unused_port() -> Result { pub fn resolve_setup(app: &mut App) { #[cfg(target_os = "macos")] app.set_activation_policy(tauri::ActivationPolicy::Accessory); - app.listen_global("react_app_mounted", move |_| { + app.listen("react_app_mounted", move |_| { tracing::debug!("Frontend React App is mounted, reset open window counter"); reset_window_open_counter(); #[cfg(target_os = "macos")] @@ -94,7 +95,7 @@ pub fn resolve_setup(app: &mut App) { } }); - handle::Handle::global().init(app.app_handle()); + handle::Handle::global().init(app.app_handle().clone()); log_err!(init::init_resources()); log_err!(init::init_service()); @@ -134,20 +135,31 @@ pub fn resolve_setup(app: &mut App) { log_err!(CoreManager::global().init()); log::trace!("init system tray"); - #[cfg(windows)] + #[cfg(any(windows, target_os = "linux"))] tray::icon::resize_images(crate::utils::help::get_max_scale_factor()); // generate latest cache icon by current scale factor - log_err!(tray::Tray::update_systray(&app.app_handle())); + let app_handle = app.app_handle().clone(); + app.listen("update_systray", move |_| { + // Fix the GTK should run on main thread issue + let app_handle_clone = app_handle.clone(); + log_err!(app_handle.run_on_main_thread(move || { + log_err!( + tray::Tray::update_systray(&app_handle_clone), + "failed to update systray" + ); + })); + }); + log_err!(app.emit("update_systray", ())); let silent_start = { Config::verge().data().enable_silent_start }; if !silent_start.unwrap_or(false) { - create_window(&app.app_handle()); + create_window(app.app_handle()); } log_err!(sysopt::Sysopt::global().init_launch()); log_err!(sysopt::Sysopt::global().init_sysproxy()); log_err!(handle::Handle::update_systray_part()); - log_err!(hotkey::Hotkey::global().init(app.app_handle())); + log_err!(hotkey::Hotkey::global().init(app.app_handle().clone())); // setup jobs log_err!(JobsManager::global_register()); @@ -165,8 +177,10 @@ pub fn resolve_reset() { } /// create main window +#[tracing_attributes::instrument(skip(app_handle))] pub fn create_window(app_handle: &AppHandle) { - if let Some(window) = app_handle.get_window("main") { + if let Some(window) = app_handle.get_webview_window("main") { + tracing::debug!("main window is already opened, try to show it"); if OPEN_WINDOWS_COUNTER.load(Ordering::Acquire) == 0 { trace_err!(window.unminimize(), "set win unminimize"); trace_err!(window.show(), "set win visible"); @@ -183,10 +197,11 @@ pub fn create_window(app_handle: &AppHandle) { .unwrap_or(&false) }; - let mut builder = tauri::window::WindowBuilder::new( + tracing::debug!("create main window..."); + let mut builder = tauri::WebviewWindowBuilder::new( app_handle, "main".to_string(), - tauri::WindowUrl::App("/".into()), + tauri::WebviewUrl::App("/".into()), ) .title("Clash Nyanpasu") .fullscreen(false) @@ -221,6 +236,7 @@ pub fn create_window(app_handle: &AppHandle) { .decorations(false) .transparent(true) .visible(false) + .additional_browser_args("--enable-features=msWebView2EnableDraggableRegions --disable-features=OverscrollHistoryNavigation,msExperimentalScrolling") .build(); #[cfg(target_os = "macos")] let win_res = builder @@ -229,11 +245,15 @@ pub fn create_window(app_handle: &AppHandle) { .title_bar_style(tauri::TitleBarStyle::Overlay) .build(); #[cfg(target_os = "linux")] - let win_res = builder.decorations(true).transparent(true).build(); + let win_res = builder.decorations(true).transparent(false).build(); #[cfg(target_os = "macos")] fn set_controls_and_log_error(app_handle: &tauri::AppHandle, window_name: &str) { - match app_handle.get_window(window_name).unwrap().ns_window() { + match app_handle + .get_webview_window(window_name) + .unwrap() + .ns_window() + { Ok(raw_window) => { let window_id: cocoa::base::id = raw_window as _; set_window_controls_pos(window_id, 26.0, 26.0); @@ -247,8 +267,6 @@ pub fn create_window(app_handle: &AppHandle) { match win_res { Ok(win) => { use tauri::{PhysicalPosition, PhysicalSize}; - #[cfg(windows)] - use window_shadows::set_shadow; if win_state.is_some() { let state = win_state.as_ref().unwrap(); @@ -273,7 +291,7 @@ pub fn create_window(app_handle: &AppHandle) { } } #[cfg(windows)] - trace_err!(set_shadow(&win, true), "set win shadow"); + trace_err!(win.set_shadow(true), "set win shadow"); log::trace!("try to calculate the monitor size"); let center = (|| -> Result { let center; @@ -310,7 +328,9 @@ pub fn create_window(app_handle: &AppHandle) { #[cfg(debug_assertions)] { - win.open_devtools(); + if let Some(webview_window) = win.get_webview_window("main") { + webview_window.open_devtools(); + } } #[cfg(target_os = "macos")] @@ -329,17 +349,23 @@ pub fn create_window(app_handle: &AppHandle) { } Err(err) => { log::error!(target: "app", "failed to create window, {err}"); + if let Some(win) = app_handle.get_webview_window("main") { + // Cleanup window if failed to create, it's a workaround for tauri bug + log_err!( + win.destroy(), + "occur error when close window while failed to create" + ); + } } } #[cfg(target_os = "windows")] { - use webview2_com_bridge::{ - webview2_com::Microsoft::Web::WebView2::Win32::ICoreWebView2Settings6, - windows::core::Interface, - }; + use webview2_com::Microsoft::Web::WebView2::Win32::ICoreWebView2Settings6; + use windows_core::Interface; + app_handle - .get_window("main") + .get_webview_window("main") .unwrap() .with_webview(|webview| unsafe { let settings = webview @@ -358,7 +384,7 @@ pub fn create_window(app_handle: &AppHandle) { /// close main window pub fn close_window(app_handle: &AppHandle) { - if let Some(window) = app_handle.get_window("main") { + if let Some(window) = app_handle.get_webview_window("main") { trace_err!(window.close(), "close window"); reset_window_open_counter() } @@ -366,12 +392,12 @@ pub fn close_window(app_handle: &AppHandle) { /// is window open pub fn is_window_open(app_handle: &AppHandle) -> bool { - app_handle.get_window("main").is_some() + app_handle.get_webview_window("main").is_some() } pub fn save_window_state(app_handle: &AppHandle, save_to_file: bool) -> Result<()> { let win = app_handle - .get_window("main") + .get_webview_window("main") .ok_or(anyhow::anyhow!("failed to get window"))?; let current_monitor = win.current_monitor()?; let verge = Config::verge(); @@ -412,21 +438,23 @@ pub fn save_window_state(app_handle: &AppHandle, save_to_file: bool) -> Result<( /// resolve core version // TODO: use enum instead -pub fn resolve_core_version(core_type: &ClashCore) -> Result { +pub async fn resolve_core_version(app_handle: &AppHandle, core_type: &ClashCore) -> Result { + let shell = app_handle.shell(); let core = core_type.clone().to_string(); log::debug!(target: "app", "check config in `{core}`"); let cmd = match core_type { ClashCore::ClashPremium | ClashCore::Mihomo | ClashCore::MihomoAlpha => { - Command::new_sidecar(core)?.args(["-v"]) + shell.sidecar(core)?.args(["-v"]) } - ClashCore::ClashRs => Command::new_sidecar(core)?.args(["-V"]), + ClashCore::ClashRs => shell.sidecar(core)?.args(["-V"]), }; - let out = cmd.output()?; - log::debug!(target: "app", "get core version: {:?}", out); + let out = cmd.output().await?; if !out.status.success() { return Err(anyhow::anyhow!("failed to get core version")); } - let out = out.stdout.trim().split(' ').collect::>(); + let out = String::from_utf8_lossy(&out.stdout); + log::trace!(target: "app", "get core version: {:?}", out); + let out = out.trim().split(' ').collect::>(); for item in out { log::debug!(target: "app", "check item: {}", item); if item.starts_with('v') diff --git a/clash-nyanpasu/backend/tauri/tauri.conf.json b/clash-nyanpasu/backend/tauri/tauri.conf.json index 41ee97b2b1..3731cdd377 100644 --- a/clash-nyanpasu/backend/tauri/tauri.conf.json +++ b/clash-nyanpasu/backend/tauri/tauri.conf.json @@ -1,118 +1,86 @@ { - "package": { - "productName": "Clash Nyanpasu", - "version": "1.6.1" - }, - "build": { - "distDir": "./tmp/dist", - "devPath": "http://localhost:3000/", - "beforeDevCommand": "pnpm run web:dev", - "beforeBuildCommand": "pnpm run-p web:build generate:git-info && echo $(pwd)" - }, - "tauri": { - "systemTray": { - "iconPath": "icons/win-tray-icon.png", - "iconAsTemplate": true - }, - "bundle": { - "active": true, - "targets": "all", - "identifier": "moe.elaina.clash.nyanpasu", - "icon": [ - "icons/32x32.png", - "icons/128x128.png", - "icons/128x128@2x.png", - "icons/icon.icns", - "icons/icon.ico" - ], - "resources": ["resources"], - "externalBin": [ - "sidecar/clash", - "sidecar/mihomo", - "sidecar/mihomo-alpha", - "sidecar/clash-rs", - "sidecar/nyanpasu-service" - ], - "copyright": "© 2024 Clash Nyanpasu All Rights Reserved", - "category": "DeveloperTool", - "shortDescription": "Clash Nyanpasu! (∠・ω< )⌒☆", - "longDescription": "Clash Nyanpasu! (∠・ω< )⌒☆", - "deb": { - "depends": ["openssl"] + "$schema": "../../node_modules/@tauri-apps/cli/config.schema.json", + "bundle": { + "active": true, + "targets": "all", + "windows": { + "certificateThumbprint": null, + "digestAlgorithm": "sha256", + "timestampUrl": "", + "webviewInstallMode": { + "silent": true, + "type": "embedBootstrapper" }, - "macOS": { - "frameworks": [], - "minimumSystemVersion": "11.0", - "exceptionDomain": "", - "signingIdentity": null, - "entitlements": null + "wix": { + "language": ["zh-CN", "en-US", "ru-RU"], + "template": "./templates/installer.wxs", + "fragmentPaths": ["./templates/cleanup.wxs"] }, - "windows": { - "certificateThumbprint": null, - "digestAlgorithm": "sha256", - "timestampUrl": "", - "webviewInstallMode": { - "silent": true, - "type": "embedBootstrapper" - }, - "wix": { - "language": ["zh-CN", "en-US", "ru-RU"], - "template": "./templates/installer.wxs", - "license": "../../LICENSE", - "fragmentPaths": ["./templates/cleanup.wxs"] - }, - "nsis": { - "displayLanguageSelector": true, - "installerIcon": "icons/icon.ico", - "languages": ["SimpChinese", "English", "Russian"], - "license": "../../LICENSE", - "installMode": "both", - "template": "./templates/installer.nsi" - } + "nsis": { + "displayLanguageSelector": true, + "installerIcon": "icons/icon.ico", + "languages": ["SimpChinese", "English", "Russian"], + "template": "./templates/installer.nsi", + "installMode": "both" } }, + "icon": [ + "icons/32x32.png", + "icons/128x128.png", + "icons/128x128@2x.png", + "icons/icon.icns", + "icons/icon.ico" + ], + "resources": ["resources"], + "externalBin": [ + "sidecar/clash", + "sidecar/mihomo", + "sidecar/mihomo-alpha", + "sidecar/clash-rs", + "sidecar/nyanpasu-service" + ], + "copyright": "© 2024 Clash Nyanpasu All Rights Reserved", + "category": "DeveloperTool", + "shortDescription": "Clash Nyanpasu! (∠・ω< )⌒☆", + "longDescription": "Clash Nyanpasu! (∠・ω< )⌒☆", + "macOS": { + "frameworks": [], + "minimumSystemVersion": "11.0", + "exceptionDomain": "", + "signingIdentity": null, + "entitlements": null + }, + "linux": { + "deb": { + "depends": ["openssl"] + } + }, + "licenseFile": "../../LICENSE", + "createUpdaterArtifacts": "v1Compatible" + }, + "build": { + "beforeBuildCommand": "pnpm run-p web:build generate:git-info && echo $(pwd)", + "frontendDist": "./tmp/dist", + "beforeDevCommand": "pnpm run web:dev", + "devUrl": "http://localhost:3000/" + }, + "productName": "Clash Nyanpasu", + "version": "1.6.0", + "identifier": "moe.elaina.clash.nyanpasu", + "plugins": { "updater": { - "active": true, + "pubkey": "dW50cnVzdGVkIGNvbW1lbnQ6IG1pbmlzaWduIHB1YmxpYyBrZXk6IDlBMUM0NjMxREZCNDRGMjYKUldRbVQ3VGZNVVljbW43N0FlWjA4UkNrbTgxSWxSSXJQcExXNkZjUTlTQkIyYkJzL0tsSWF2d0cK", "endpoints": [ "https://mirror.ghproxy.com/https://github.com/LibNyanpasu/clash-nyanpasu/releases/download/updater/update-proxy.json", "https://gh-proxy.com/https://github.com/LibNyanpasu/clash-nyanpasu/releases/download/updater/update-proxy.json", "https://github.com/LibNyanpasu/clash-nyanpasu/releases/download/updater/update.json" - ], - "dialog": false, - "pubkey": "dW50cnVzdGVkIGNvbW1lbnQ6IG1pbmlzaWduIHB1YmxpYyBrZXk6IDlBMUM0NjMxREZCNDRGMjYKUldRbVQ3VGZNVVljbW43N0FlWjA4UkNrbTgxSWxSSXJQcExXNkZjUTlTQkIyYkJzL0tsSWF2d0cK" - }, - "allowlist": { - "shell": { - "all": true - }, - "window": { - "all": true - }, - "process": { - "all": true - }, - "globalShortcut": { - "all": true - }, - "notification": { - "all": true - }, - "os": { - "all": true - }, - "clipboard": { - "all": true - }, - "fs": { - "all": true - }, - "dialog": { - "all": true - } - }, + ] + } + }, + "app": { "windows": [], "security": { - "csp": "script-src 'unsafe-eval' 'self'; default-src blob: data: filesystem: ws: wss: http: https: tauri: 'unsafe-eval' 'unsafe-inline' 'self'; img-src 'self' data: asset: blob: http://localhost:* https:;" + "csp": "script-src 'unsafe-eval' 'self'; default-src blob: data: filesystem: ws: wss: http: https: tauri: 'unsafe-eval' 'unsafe-inline' 'self'; img-src 'self' data: asset: blob: http://localhost:* https:; connect-src ipc: http://ipc.localhost http://127.0.0.1:* http://localhost:* ws://127.0.0.1:* ws://localhost:* wss://*" } } } diff --git a/clash-nyanpasu/backend/tauri/tauri.windows.conf.json b/clash-nyanpasu/backend/tauri/tauri.windows.conf.json new file mode 100644 index 0000000000..ff10209e98 --- /dev/null +++ b/clash-nyanpasu/backend/tauri/tauri.windows.conf.json @@ -0,0 +1,6 @@ +{ + "$schema": "../../node_modules/@tauri-apps/cli/config.schema.json", + "bundle": { + "targets": ["nsis"] + } +} diff --git a/clash-nyanpasu/backend/tauri/templates/installer.nsi b/clash-nyanpasu/backend/tauri/templates/installer.nsi index 03e61e681a..08e7ba5912 100644 --- a/clash-nyanpasu/backend/tauri/templates/installer.nsi +++ b/clash-nyanpasu/backend/tauri/templates/installer.nsi @@ -481,11 +481,12 @@ FunctionEnd !macro CheckAllNyanpasuProcesses !insertmacro CheckNyanpasuProcess "Clash Nyanpasu.exe" "1" - ; !insertmacro CheckNyanpasuProcess "clash-verge-service.exe" "2" - !insertmacro CheckNyanpasuProcess "clash.exe" "3" - !insertmacro CheckNyanpasuProcess "clash-rs.exe" "4" - !insertmacro CheckNyanpasuProcess "mihomo.exe" "5" - !insertmacro CheckNyanpasuProcess "mihomo-alpha.exe" "6" + !insertmacro CheckNyanpasuProcess "clash-nyanpasu.exe" "2" + ; !insertmacro CheckNyanpasuProcess "clash-verge-service.exe" "3" + !insertmacro CheckNyanpasuProcess "clash.exe" "4" + !insertmacro CheckNyanpasuProcess "clash-rs.exe" "5" + !insertmacro CheckNyanpasuProcess "mihomo.exe" "6" + !insertmacro CheckNyanpasuProcess "mihomo-alpha.exe" "7" !macroend ; Section CheckProcesses diff --git a/clash-nyanpasu/backend/webview2-com-bridge/Cargo.toml b/clash-nyanpasu/backend/webview2-com-bridge/Cargo.toml deleted file mode 100644 index 57323a5605..0000000000 --- a/clash-nyanpasu/backend/webview2-com-bridge/Cargo.toml +++ /dev/null @@ -1,11 +0,0 @@ -[package] -name = "webview2-com-bridge" -version = "0.1.0" -repository.workspace = true -edition.workspace = true -license.workspace = true -authors.workspace = true - -[dependencies] -webview2-com = "0.19" -windows = "0.39" diff --git a/clash-nyanpasu/backend/webview2-com-bridge/src/lib.rs b/clash-nyanpasu/backend/webview2-com-bridge/src/lib.rs deleted file mode 100644 index c0ff402805..0000000000 --- a/clash-nyanpasu/backend/webview2-com-bridge/src/lib.rs +++ /dev/null @@ -1,2 +0,0 @@ -pub use webview2_com; -pub use windows; diff --git a/clash-nyanpasu/frontend/interface/package.json b/clash-nyanpasu/frontend/interface/package.json index 209966bfe0..ca4d4275d6 100644 --- a/clash-nyanpasu/frontend/interface/package.json +++ b/clash-nyanpasu/frontend/interface/package.json @@ -11,7 +11,7 @@ "build": "tsc" }, "dependencies": { - "@tauri-apps/api": "1.6.0", + "@tauri-apps/api": "2.0.0-rc.4", "ahooks": "3.8.1", "ofetch": "1.3.4", "react": "18.3.1", diff --git a/clash-nyanpasu/frontend/interface/src/service/tauri.ts b/clash-nyanpasu/frontend/interface/src/service/tauri.ts index b5336f3ecc..6cb67ec119 100644 --- a/clash-nyanpasu/frontend/interface/src/service/tauri.ts +++ b/clash-nyanpasu/frontend/interface/src/service/tauri.ts @@ -1,5 +1,5 @@ import { IPSBResponse } from "@/openapi"; -import { invoke } from "@tauri-apps/api/tauri"; +import { invoke } from "@tauri-apps/api/core"; import { ManifestVersion } from "./core"; import { ClashConfig, @@ -259,3 +259,7 @@ export const isAppImage = async () => { export const getServiceInstallPrompt = async () => { return await invoke("get_service_install_prompt"); }; + +export const cleanupProcesses = async () => { + return await invoke("cleanup_processes"); +}; diff --git a/clash-nyanpasu/frontend/nyanpasu/package.json b/clash-nyanpasu/frontend/nyanpasu/package.json index 22e14b6d53..7de2146bb7 100644 --- a/clash-nyanpasu/frontend/nyanpasu/package.json +++ b/clash-nyanpasu/frontend/nyanpasu/package.json @@ -22,7 +22,7 @@ "@mui/material": "5.16.7", "@nyanpasu/interface": "workspace:^", "@nyanpasu/ui": "workspace:^", - "@tauri-apps/api": "1.6.0", + "@tauri-apps/api": "2.0.0-rc.4", "@types/json-schema": "7.0.15", "ahooks": "3.8.1", "allotment": "1.20.2", @@ -52,13 +52,21 @@ "@csstools/normalize.css": "12.1.1", "@emotion/babel-plugin": "11.12.0", "@emotion/react": "11.13.3", - "@iconify/json": "2.2.245", + "@iconify/json": "2.2.246", + "@tauri-apps/plugin-clipboard-manager": "2.0.0-rc.1", + "@tauri-apps/plugin-dialog": "2.0.0-rc.1", + "@tauri-apps/plugin-fs": "2.0.0-rc.2", + "@tauri-apps/plugin-notification": "2.0.0-rc.1", + "@tauri-apps/plugin-os": "2.0.0-rc.1", + "@tauri-apps/plugin-process": "2.0.0-rc.1", + "@tauri-apps/plugin-shell": "2.0.0-rc.1", + "@tauri-apps/plugin-updater": "2.0.0-rc.2", "@types/react": "18.3.5", "@types/react-dom": "18.3.0", "@vitejs/plugin-react": "4.3.1", "@vitejs/plugin-react-swc": "3.7.0", "clsx": "2.1.1", - "meta-json-schema": "libnyanpasu/meta-json-schema#main", + "meta-json-schema": "1.18.8", "monaco-yaml": "5.2.2", "nanoid": "5.0.7", "sass": "1.78.0", diff --git a/clash-nyanpasu/frontend/nyanpasu/src/components/app/app-container.tsx b/clash-nyanpasu/frontend/nyanpasu/src/components/app/app-container.tsx index 8f4da35929..8f19f13123 100644 --- a/clash-nyanpasu/frontend/nyanpasu/src/components/app/app-container.tsx +++ b/clash-nyanpasu/frontend/nyanpasu/src/components/app/app-container.tsx @@ -2,7 +2,7 @@ import { Allotment } from "allotment"; import getSystem from "@/utils/get-system"; import { alpha, useTheme } from "@mui/material"; import Paper from "@mui/material/Paper"; -import { appWindow } from "@tauri-apps/api/window"; +import { getCurrentWebviewWindow } from "@tauri-apps/api/webviewWindow"; import "allotment/dist/style.css"; import { ReactNode } from "react"; import { LayoutControl } from "../layout/layout-control"; @@ -10,6 +10,8 @@ import styles from "./app-container.module.scss"; import AppDrawer from "./app-drawer"; import DrawerContent from "./drawer-content"; +const appWindow = getCurrentWebviewWindow(); + const OS = getSystem(); export const AppContainer = ({ diff --git a/clash-nyanpasu/frontend/nyanpasu/src/components/dashboard/proxy-shortcuts.tsx b/clash-nyanpasu/frontend/nyanpasu/src/components/dashboard/proxy-shortcuts.tsx index 573ec8f6f0..6e68982112 100644 --- a/clash-nyanpasu/frontend/nyanpasu/src/components/dashboard/proxy-shortcuts.tsx +++ b/clash-nyanpasu/frontend/nyanpasu/src/components/dashboard/proxy-shortcuts.tsx @@ -81,7 +81,7 @@ export const ProxyShortcuts = () => { } catch (e) { message(`Activation failed!`, { title: t("Error"), - type: "error", + kind: "error", }); } finally { } diff --git a/clash-nyanpasu/frontend/nyanpasu/src/components/layout/layout-control.tsx b/clash-nyanpasu/frontend/nyanpasu/src/components/layout/layout-control.tsx index 63a0d48978..36dda424bb 100644 --- a/clash-nyanpasu/frontend/nyanpasu/src/components/layout/layout-control.tsx +++ b/clash-nyanpasu/frontend/nyanpasu/src/components/layout/layout-control.tsx @@ -1,6 +1,6 @@ import { useMemoizedFn } from "ahooks"; import { debounce } from "lodash-es"; -import { useEffect, useState } from "react"; +import { useEffect, useRef, useState } from "react"; import { notification, NotificationType } from "@/utils/notification"; import { CloseRounded, @@ -13,8 +13,10 @@ import { import { alpha, Button, ButtonProps, useTheme } from "@mui/material"; import { save_window_size_state, useNyanpasu } from "@nyanpasu/interface"; import { cn } from "@nyanpasu/ui"; -import { platform, type Platform } from "@tauri-apps/api/os"; -import { appWindow } from "@tauri-apps/api/window"; +import { getCurrentWebviewWindow } from "@tauri-apps/api/webviewWindow"; +import { platform as getPlatform } from "@tauri-apps/plugin-os"; + +const appWindow = getCurrentWebviewWindow(); const CtrlButton = (props: ButtonProps) => { const { palette } = useTheme(); @@ -35,7 +37,7 @@ export const LayoutControl = ({ className }: { className?: string }) => { const { nyanpasuConfig, setNyanpasuConfig } = useNyanpasu(); const [isMaximized, setIsMaximized] = useState(false); - const [platfrom, setPlatform] = useState("win32"); + const platform = useRef(getPlatform()); const updateMaximized = async () => { try { @@ -60,11 +62,6 @@ export const LayoutControl = ({ className }: { className?: string }) => { // Update the maximized state updateMaximized(); - // Get the platform - platform().then((platform) => { - setPlatform(() => platform); - }); - // Add a resize handler to update the maximized state const resizeHandler = debounce(updateMaximized, 1000); @@ -112,7 +109,7 @@ export const LayoutControl = ({ className }: { className?: string }) => { { - if (platfrom === "win32") { + if (platform.current === "windows") { save_window_size_state().finally(() => { appWindow.close(); }); diff --git a/clash-nyanpasu/frontend/nyanpasu/src/components/layout/use-custom-theme.tsx b/clash-nyanpasu/frontend/nyanpasu/src/components/layout/use-custom-theme.tsx index 051303819f..0ef467c79e 100644 --- a/clash-nyanpasu/frontend/nyanpasu/src/components/layout/use-custom-theme.tsx +++ b/clash-nyanpasu/frontend/nyanpasu/src/components/layout/use-custom-theme.tsx @@ -7,7 +7,9 @@ import { themeMode as themeModeAtom } from "@/store"; import { alpha, darken, lighten, Theme, useColorScheme } from "@mui/material"; import { useNyanpasu } from "@nyanpasu/interface"; import { cn, createMDYTheme } from "@nyanpasu/ui"; -import { appWindow } from "@tauri-apps/api/window"; +import { getCurrentWebviewWindow } from "@tauri-apps/api/webviewWindow"; + +const appWindow = getCurrentWebviewWindow(); const applyRootStyleVar = (mode: "light" | "dark", theme: Theme) => { const root = document.documentElement; diff --git a/clash-nyanpasu/frontend/nyanpasu/src/components/profiles/modules/side-chain.tsx b/clash-nyanpasu/frontend/nyanpasu/src/components/profiles/modules/side-chain.tsx index 4d021a936b..31400accb9 100644 --- a/clash-nyanpasu/frontend/nyanpasu/src/components/profiles/modules/side-chain.tsx +++ b/clash-nyanpasu/frontend/nyanpasu/src/components/profiles/modules/side-chain.tsx @@ -54,7 +54,7 @@ export const SideChain = ({ onChainEdit }: SideChainProps) => { } } catch (e) { message(`Apply error: ${formatError(e)}`, { - type: "error", + kind: "error", title: t("Error"), }); } diff --git a/clash-nyanpasu/frontend/nyanpasu/src/components/profiles/profile-dialog.tsx b/clash-nyanpasu/frontend/nyanpasu/src/components/profiles/profile-dialog.tsx index c6aaa07acc..77a83c4025 100644 --- a/clash-nyanpasu/frontend/nyanpasu/src/components/profiles/profile-dialog.tsx +++ b/clash-nyanpasu/frontend/nyanpasu/src/components/profiles/profile-dialog.tsx @@ -118,7 +118,7 @@ export const ProfileDialog = ({ const onSubmit = handleSubmit(async (form) => { if (editorHasError()) { message("Please fix the error before saving", { - type: "error", + kind: "error", }); return; } diff --git a/clash-nyanpasu/frontend/nyanpasu/src/components/profiles/profile-item.tsx b/clash-nyanpasu/frontend/nyanpasu/src/components/profiles/profile-item.tsx index 620277c454..2a03aba9cb 100644 --- a/clash-nyanpasu/frontend/nyanpasu/src/components/profiles/profile-item.tsx +++ b/clash-nyanpasu/frontend/nyanpasu/src/components/profiles/profile-item.tsx @@ -122,7 +122,7 @@ export const ProfileItem = memo(function ProfileItem({ : `Error setting profile: \n ${err instanceof Error ? err.message : String(err)}`, { title: t("Error"), - type: "error", + kind: "error", }, ); } finally { @@ -161,7 +161,7 @@ export const ProfileItem = memo(function ProfileItem({ } catch (err) { message(`Delete failed: \n ${JSON.stringify(err)}`, { title: t("Error"), - type: "error", + kind: "error", }); } }); diff --git a/clash-nyanpasu/frontend/nyanpasu/src/components/profiles/quick-import.tsx b/clash-nyanpasu/frontend/nyanpasu/src/components/profiles/quick-import.tsx index 9b803c46dd..6a477843eb 100644 --- a/clash-nyanpasu/frontend/nyanpasu/src/components/profiles/quick-import.tsx +++ b/clash-nyanpasu/frontend/nyanpasu/src/components/profiles/quick-import.tsx @@ -15,7 +15,7 @@ import { useTheme, } from "@mui/material"; import { useClash } from "@nyanpasu/interface"; -import { readText } from "@tauri-apps/api/clipboard"; +import { readText } from "@tauri-apps/plugin-clipboard-manager"; export const QuickImport = () => { const { t } = useTranslation(); diff --git a/clash-nyanpasu/frontend/nyanpasu/src/components/profiles/read-profile.tsx b/clash-nyanpasu/frontend/nyanpasu/src/components/profiles/read-profile.tsx index 1b95b16251..6538e91788 100644 --- a/clash-nyanpasu/frontend/nyanpasu/src/components/profiles/read-profile.tsx +++ b/clash-nyanpasu/frontend/nyanpasu/src/components/profiles/read-profile.tsx @@ -1,8 +1,8 @@ import { useState } from "react"; import getSystem from "@/utils/get-system"; import LoadingButton from "@mui/lab/LoadingButton"; -import { open } from "@tauri-apps/api/dialog"; -import { readTextFile } from "@tauri-apps/api/fs"; +import { open } from "@tauri-apps/plugin-dialog"; +import { readTextFile } from "@tauri-apps/plugin-fs"; const isWin = getSystem() === "windows"; diff --git a/clash-nyanpasu/frontend/nyanpasu/src/components/profiles/script-dialog.tsx b/clash-nyanpasu/frontend/nyanpasu/src/components/profiles/script-dialog.tsx index ba8d6d6ad1..0f7051cd60 100644 --- a/clash-nyanpasu/frontend/nyanpasu/src/components/profiles/script-dialog.tsx +++ b/clash-nyanpasu/frontend/nyanpasu/src/components/profiles/script-dialog.tsx @@ -103,7 +103,7 @@ export const ScriptDialog = ({ const onSubmit = form.handleSubmit(async (data) => { if (editorHasError()) { message("Please fix the error before submitting", { - type: "error", + kind: "error", }); return; } diff --git a/clash-nyanpasu/frontend/nyanpasu/src/components/providers/proxies-provider.tsx b/clash-nyanpasu/frontend/nyanpasu/src/components/providers/proxies-provider.tsx index 019bb2a77f..2d4839408d 100644 --- a/clash-nyanpasu/frontend/nyanpasu/src/components/providers/proxies-provider.tsx +++ b/clash-nyanpasu/frontend/nyanpasu/src/components/providers/proxies-provider.tsx @@ -27,7 +27,7 @@ export const ProxiesProvider = ({ provider }: ProxiesProviderProps) => { await updateProxiesProviders(provider.name); } catch (e) { message(`Update ${provider.name} failed.\n${String(e)}`, { - type: "error", + kind: "error", title: t("Error"), }); } finally { diff --git a/clash-nyanpasu/frontend/nyanpasu/src/components/providers/rules-provider.tsx b/clash-nyanpasu/frontend/nyanpasu/src/components/providers/rules-provider.tsx index ec4cf4160f..f6d5bf7793 100644 --- a/clash-nyanpasu/frontend/nyanpasu/src/components/providers/rules-provider.tsx +++ b/clash-nyanpasu/frontend/nyanpasu/src/components/providers/rules-provider.tsx @@ -26,7 +26,7 @@ export default function RulesProvider({ provider }: RulesProviderProps) { await updateRulesProviders(provider.name); } catch (e) { message(`Update ${provider.name} failed.\n${String(e)}`, { - type: "error", + kind: "error", title: t("Error"), }); } finally { diff --git a/clash-nyanpasu/frontend/nyanpasu/src/components/providers/update-providers.tsx b/clash-nyanpasu/frontend/nyanpasu/src/components/providers/update-providers.tsx index 0ccaf4e954..de361e6e24 100644 --- a/clash-nyanpasu/frontend/nyanpasu/src/components/providers/update-providers.tsx +++ b/clash-nyanpasu/frontend/nyanpasu/src/components/providers/update-providers.tsx @@ -16,7 +16,7 @@ export const UpdateProviders = () => { const handleProviderUpdate = useLockFn(async () => { if (!getRulesProviders.data) { message(`No Providers.`, { - type: "info", + kind: "info", title: t("Info"), }); @@ -35,7 +35,7 @@ export const UpdateProviders = () => { ); } catch (e) { message(`Update all failed.\n${String(e)}`, { - type: "error", + kind: "error", title: t("Error"), }); } finally { diff --git a/clash-nyanpasu/frontend/nyanpasu/src/components/providers/update-proxies-providers.tsx b/clash-nyanpasu/frontend/nyanpasu/src/components/providers/update-proxies-providers.tsx index b0c4adad6f..1896871e10 100644 --- a/clash-nyanpasu/frontend/nyanpasu/src/components/providers/update-proxies-providers.tsx +++ b/clash-nyanpasu/frontend/nyanpasu/src/components/providers/update-proxies-providers.tsx @@ -16,7 +16,7 @@ export const UpdateProxiesProviders = () => { const handleProviderUpdate = useLockFn(async () => { if (!getProxiesProviders.data) { message(`No Providers.`, { - type: "info", + kind: "info", title: t("Info"), }); @@ -35,7 +35,7 @@ export const UpdateProxiesProviders = () => { ); } catch (e) { message(`Update all failed.\n${String(e)}`, { - type: "error", + kind: "error", title: t("Error"), }); } finally { diff --git a/clash-nyanpasu/frontend/nyanpasu/src/components/setting/modules/clash-core.tsx b/clash-nyanpasu/frontend/nyanpasu/src/components/setting/modules/clash-core.tsx index 6f554689d6..9da963636e 100644 --- a/clash-nyanpasu/frontend/nyanpasu/src/components/setting/modules/clash-core.tsx +++ b/clash-nyanpasu/frontend/nyanpasu/src/components/setting/modules/clash-core.tsx @@ -6,6 +6,7 @@ import ClashRs from "@/assets/image/core/clash-rs.png"; import ClashMeta from "@/assets/image/core/clash.meta.png"; import Clash from "@/assets/image/core/clash.png"; import { formatError } from "@/utils"; +import { message } from "@/utils/notification"; import parseTraffic from "@/utils/parse-traffic"; import FiberManualRecord from "@mui/icons-material/FiberManualRecord"; import Update from "@mui/icons-material/Update"; @@ -22,7 +23,6 @@ import { useNyanpasu, } from "@nyanpasu/interface"; import { cleanDeepClickEvent, cn } from "@nyanpasu/ui"; -import { message } from "@tauri-apps/api/dialog"; export const getImage = (core: ClashCore) => { switch (core) { @@ -175,12 +175,12 @@ export const ClashCoreItem = ({ getClashCore.mutate(); message(`Successfully update core ${data.name}`, { - type: "info", + kind: "info", title: t("Success"), }); } catch (e) { message(`Update failed. ${formatError(e)}`, { - type: "error", + kind: "error", title: t("Error"), }); } finally { diff --git a/clash-nyanpasu/frontend/nyanpasu/src/components/setting/modules/tray-icon-dialog.tsx b/clash-nyanpasu/frontend/nyanpasu/src/components/setting/modules/tray-icon-dialog.tsx index 0444c38b00..f8825f4a14 100644 --- a/clash-nyanpasu/frontend/nyanpasu/src/components/setting/modules/tray-icon-dialog.tsx +++ b/clash-nyanpasu/frontend/nyanpasu/src/components/setting/modules/tray-icon-dialog.tsx @@ -11,7 +11,7 @@ import { setTrayIcon as setTrayIconCall, } from "@nyanpasu/interface"; import { BaseDialog, BaseDialogProps } from "@nyanpasu/ui"; -import { open } from "@tauri-apps/api/dialog"; +import { open } from "@tauri-apps/plugin-dialog"; function TrayIconItem({ mode }: { mode: "system_proxy" | "tun" | "normal" }) { const { t } = useTranslation(); @@ -53,7 +53,7 @@ function TrayIconItem({ mode }: { mode: "system_proxy" | "tun" | "normal" }) { return await setTrayIconCall(mode, selected); } catch (e) { message(formatError(e), { - type: "error", + kind: "error", }); } finally { setTs(Date.now()); diff --git a/clash-nyanpasu/frontend/nyanpasu/src/components/setting/setting-clash-base.tsx b/clash-nyanpasu/frontend/nyanpasu/src/components/setting/setting-clash-base.tsx index a92829677d..c90c35e4b0 100644 --- a/clash-nyanpasu/frontend/nyanpasu/src/components/setting/setting-clash-base.tsx +++ b/clash-nyanpasu/frontend/nyanpasu/src/components/setting/setting-clash-base.tsx @@ -24,7 +24,7 @@ export const SettingClashBase = () => { } catch (e) { message(`Failed to Open UWP Tools.\n${JSON.stringify(e)}`, { title: t("Error"), - type: "error", + kind: "error", }); } }; diff --git a/clash-nyanpasu/frontend/nyanpasu/src/components/setting/setting-clash-core.tsx b/clash-nyanpasu/frontend/nyanpasu/src/components/setting/setting-clash-core.tsx index 70a76e6652..09aa1d6c2a 100644 --- a/clash-nyanpasu/frontend/nyanpasu/src/components/setting/setting-clash-core.tsx +++ b/clash-nyanpasu/frontend/nyanpasu/src/components/setting/setting-clash-core.tsx @@ -27,7 +27,7 @@ export const SettingClashCore = () => { } = useNyanpasu({ onLatestCoreError: (error) => { message(`Fetch latest core failed: ${formatError(error)}`, { - type: "error", + kind: "error", title: t("Error"), }); }, @@ -57,7 +57,7 @@ export const SettingClashCore = () => { await setClashCore(core); message(`Successfully switch to ${core}`, { - type: "info", + kind: "info", title: t("Success"), }); } catch (e) { @@ -66,7 +66,7 @@ export const SettingClashCore = () => { e instanceof Error ? e.message : String(e) }`, { - type: "error", + kind: "error", title: t("Error"), }, ); @@ -80,14 +80,18 @@ export const SettingClashCore = () => { await restartSidecar(); message(t("Successfully restart core"), { - type: "info", + kind: "info", title: t("Success"), }); } catch (e) { - message("Restart failed, please check log.", { - type: "error", - title: t("Error"), - }); + message( + "Restart failed, full detailed please check the log.\n\nError:" + + formatError(e), + { + kind: "error", + title: t("Error"), + }, + ); } }; @@ -96,7 +100,7 @@ export const SettingClashCore = () => { await getLatestCore.mutate(); } catch (e) { message("Fetch failed, please check your internet connection.", { - type: "error", + kind: "error", title: t("Error"), }); } diff --git a/clash-nyanpasu/frontend/nyanpasu/src/components/setting/setting-clash-external.tsx b/clash-nyanpasu/frontend/nyanpasu/src/components/setting/setting-clash-external.tsx index 6476f5e320..e91318630d 100644 --- a/clash-nyanpasu/frontend/nyanpasu/src/components/setting/setting-clash-external.tsx +++ b/clash-nyanpasu/frontend/nyanpasu/src/components/setting/setting-clash-external.tsx @@ -83,7 +83,7 @@ export const SettingClashExternal = () => { } catch (e) { message(JSON.stringify(e), { title: t("Error"), - type: "error", + kind: "error", }); } finally { setExpand(false); diff --git a/clash-nyanpasu/frontend/nyanpasu/src/components/setting/setting-clash-port.tsx b/clash-nyanpasu/frontend/nyanpasu/src/components/setting/setting-clash-port.tsx index 4069e7d859..7f735ca76f 100644 --- a/clash-nyanpasu/frontend/nyanpasu/src/components/setting/setting-clash-port.tsx +++ b/clash-nyanpasu/frontend/nyanpasu/src/components/setting/setting-clash-port.tsx @@ -45,12 +45,12 @@ export const SettingClashPort = () => { } catch (e) { message(JSON.stringify(e), { title: t("Error"), - type: "error", + kind: "error", }); } finally { message(t("After restart to take effect"), { title: t("Success"), - type: "info", + kind: "info", }); } }} diff --git a/clash-nyanpasu/frontend/nyanpasu/src/components/setting/setting-nyanpasu-path.tsx b/clash-nyanpasu/frontend/nyanpasu/src/components/setting/setting-nyanpasu-path.tsx index 34f5557e04..30892603da 100644 --- a/clash-nyanpasu/frontend/nyanpasu/src/components/setting/setting-nyanpasu-path.tsx +++ b/clash-nyanpasu/frontend/nyanpasu/src/components/setting/setting-nyanpasu-path.tsx @@ -14,7 +14,7 @@ import { setCustomAppDir, } from "@nyanpasu/interface"; import { BaseCard } from "@nyanpasu/ui"; -import { open } from "@tauri-apps/api/dialog"; +import { open } from "@tauri-apps/plugin-dialog"; import { PaperButton } from "./modules/nyanpasu-path"; export const SettingNyanpasuPath = () => { @@ -36,7 +36,7 @@ export const SettingNyanpasuPath = () => { if (Array.isArray(selected)) { message(t("Multiple directories are not supported"), { title: t("Error"), - type: "error", + kind: "error", }); return; @@ -46,7 +46,7 @@ export const SettingNyanpasuPath = () => { message(t("App directory changed successfully"), { title: t("Success"), - type: "error", + kind: "error", }); await sleep(1000); @@ -55,7 +55,7 @@ export const SettingNyanpasuPath = () => { } catch (e) { message(`Migration failed! ${JSON.stringify(e)}`, { title: t("Error"), - type: "error", + kind: "error", }); } }); diff --git a/clash-nyanpasu/frontend/nyanpasu/src/components/setting/setting-nyanpasu-version.tsx b/clash-nyanpasu/frontend/nyanpasu/src/components/setting/setting-nyanpasu-version.tsx index 60038bc40a..7bf747eeba 100644 --- a/clash-nyanpasu/frontend/nyanpasu/src/components/setting/setting-nyanpasu-version.tsx +++ b/clash-nyanpasu/frontend/nyanpasu/src/components/setting/setting-nyanpasu-version.tsx @@ -4,7 +4,7 @@ import { useState } from "react"; import { useTranslation } from "react-i18next"; import LogoSvg from "@/assets/image/logo.svg?react"; import { useUpdaterPlatformSupported } from "@/hooks/use-updater"; -import { UpdaterManifestAtom } from "@/store/updater"; +import { UpdaterInstanceAtom } from "@/store/updater"; import { formatError } from "@/utils"; import { message } from "@/utils/notification"; import LoadingButton from "@mui/lab/LoadingButton"; @@ -20,7 +20,7 @@ import { import { useNyanpasu } from "@nyanpasu/interface"; import { BaseCard } from "@nyanpasu/ui"; import { version } from "@root/package.json"; -import { checkUpdate } from "@tauri-apps/api/updater"; +import { check as checkUpdate } from "@tauri-apps/plugin-updater"; import { LabelSwitch } from "./modules/clash-field"; const AutoCheckUpdate = () => { @@ -48,28 +48,28 @@ export const SettingNyanpasuVersion = () => { const [loading, setLoading] = useState(false); - const setUpdaterManifest = useSetAtom(UpdaterManifestAtom); + const setUpdaterInstance = useSetAtom(UpdaterInstanceAtom); const isPlatformSupported = useUpdaterPlatformSupported(); const onCheckUpdate = useLockFn(async () => { try { setLoading(true); - const info = await checkUpdate(); + const update = await checkUpdate(); - if (!info?.shouldUpdate) { + if (!update?.available) { message(t("No update available."), { title: t("Info"), - type: "info", + kind: "info", }); } else { - setUpdaterManifest(info.manifest || null); + setUpdaterInstance(update || null); } } catch (e) { message( `Update check failed. Please verify your network connection.\n\n${formatError(e)}`, { title: t("Error"), - type: "error", + kind: "error", }, ); } finally { diff --git a/clash-nyanpasu/frontend/nyanpasu/src/components/setting/setting-system-proxy.tsx b/clash-nyanpasu/frontend/nyanpasu/src/components/setting/setting-system-proxy.tsx index 3331cc1bc2..3b06595564 100644 --- a/clash-nyanpasu/frontend/nyanpasu/src/components/setting/setting-system-proxy.tsx +++ b/clash-nyanpasu/frontend/nyanpasu/src/components/setting/setting-system-proxy.tsx @@ -44,7 +44,7 @@ export const SettingSystemProxy = () => { } catch (e) { message(`Activation failed!`, { title: t("Error"), - type: "error", + kind: "error", }); } finally { loading[key] = false; diff --git a/clash-nyanpasu/frontend/nyanpasu/src/components/setting/setting-system-service.tsx b/clash-nyanpasu/frontend/nyanpasu/src/components/setting/setting-system-service.tsx index 4124d64f4f..5eb7abf3b5 100644 --- a/clash-nyanpasu/frontend/nyanpasu/src/components/setting/setting-system-service.tsx +++ b/clash-nyanpasu/frontend/nyanpasu/src/components/setting/setting-system-service.tsx @@ -74,7 +74,7 @@ export const SettingSystemService = () => { }: ${formatError(e)}`; message(errorMessage, { - type: "error", + kind: "error", title: t("Error"), }); // If install failed show a prompt to user to install the service manually @@ -109,7 +109,7 @@ export const SettingSystemService = () => { : `Start failed: ${formatError(e)}`; message(errorMessage, { - type: "error", + kind: "error", title: t("Error"), }); // If start failed show a prompt to user to start the service manually diff --git a/clash-nyanpasu/frontend/nyanpasu/src/components/updater/updater-dialog-wrapper.tsx b/clash-nyanpasu/frontend/nyanpasu/src/components/updater/updater-dialog-wrapper.tsx index 136f87232c..7910d835e1 100644 --- a/clash-nyanpasu/frontend/nyanpasu/src/components/updater/updater-dialog-wrapper.tsx +++ b/clash-nyanpasu/frontend/nyanpasu/src/components/updater/updater-dialog-wrapper.tsx @@ -1,12 +1,12 @@ import { useAtom } from "jotai"; import { lazy, Suspense, useState } from "react"; -import { UpdaterManifestAtom } from "@/store/updater"; +import { UpdaterInstanceAtom } from "@/store/updater"; const UpdaterDialog = lazy(() => import("./updater-dialog")); export const UpdaterDialogWrapper = () => { const [open, setOpen] = useState(true); - const [manifest, setManifest] = useAtom(UpdaterManifestAtom); + const [manifest, setManifest] = useAtom(UpdaterInstanceAtom); if (!manifest) return null; return ( @@ -16,7 +16,7 @@ export const UpdaterDialogWrapper = () => { setOpen(false); setManifest(null); }} - manifest={manifest} + update={manifest} /> ); diff --git a/clash-nyanpasu/frontend/nyanpasu/src/components/updater/updater-dialog.tsx b/clash-nyanpasu/frontend/nyanpasu/src/components/updater/updater-dialog.tsx index 8bc886d9d5..4fdbc3759c 100644 --- a/clash-nyanpasu/frontend/nyanpasu/src/components/updater/updater-dialog.tsx +++ b/clash-nyanpasu/frontend/nyanpasu/src/components/updater/updater-dialog.tsx @@ -1,44 +1,62 @@ import { useLockFn } from "ahooks"; import dayjs from "dayjs"; import { useSetAtom } from "jotai"; -import { lazy, Suspense } from "react"; +import { lazy, Suspense, useCallback, useState } from "react"; import { useTranslation } from "react-i18next"; import { UpdaterIgnoredAtom } from "@/store/updater"; import { formatError } from "@/utils"; import { message } from "@/utils/notification"; -import { Button } from "@mui/material"; +import { Button, LinearProgress } from "@mui/material"; +import { cleanupProcesses, openThat } from "@nyanpasu/interface"; import { BaseDialog, BaseDialogProps, cn } from "@nyanpasu/ui"; -import { relaunch } from "@tauri-apps/api/process"; -import { open as openThat } from "@tauri-apps/api/shell"; -import { installUpdate, type UpdateManifest } from "@tauri-apps/api/updater"; +import { relaunch } from "@tauri-apps/plugin-process"; +import { DownloadEvent, type Update } from "@tauri-apps/plugin-updater"; import styles from "./updater-dialog.module.scss"; const Markdown = lazy(() => import("react-markdown")); export interface UpdaterDialogProps extends Omit { - manifest: UpdateManifest; + update: Update; } export default function UpdaterDialog({ open, - manifest, + update, onClose, ...others }: UpdaterDialogProps) { const { t } = useTranslation(); const setUpdaterIgnore = useSetAtom(UpdaterIgnoredAtom); + const [contentLength, setContentLength] = useState(0); + const [contentDownloaded, setContentDownloaded] = useState(0); + const progress = + contentDownloaded && contentLength + ? (contentDownloaded / contentLength) * 100 + : 0; + const onDownloadEvent = useCallback((e: DownloadEvent) => { + switch (e.event) { + case "Started": + setContentLength(e.data.contentLength || 0); + break; + case "Progress": + setContentDownloaded((prev) => prev + e.data.chunkLength); + break; + } + }, []); const handleUpdate = useLockFn(async () => { try { // Install the update. This will also restart the app on Windows! - await installUpdate(); - + await update.download(onDownloadEvent); + await cleanupProcesses(); + // cleanup and stop core + await update.install(); // On macOS and Linux you will need to restart the app manually. // You could use this step to display another confirmation dialog. await relaunch(); } catch (e) { console.error(e); - message(formatError(e), { type: "error", title: t("Error") }); + message(formatError(e), { kind: "error", title: t("Error") }); } }); @@ -48,7 +66,7 @@ export default function UpdaterDialog({ title={t("updater.title")} open={open} onClose={() => { - setUpdaterIgnore(manifest.version); // TODO: control this behavior + setUpdaterIgnore(update.version); // TODO: control this behavior onClose?.(); }} onOk={handleUpdate} @@ -64,9 +82,9 @@ export default function UpdaterDialog({ >
- {manifest.version} + {update.version} - {dayjs(manifest.date, "YYYY-MM-DD H:mm:ss Z").format( + {dayjs(update.date, "YYYY-MM-DD H:mm:ss Z").format( "YYYY-MM-DD HH:mm:ss", )} @@ -76,7 +94,7 @@ export default function UpdaterDialog({ size="small" onClick={() => { openThat( - `https://github.com/LibNyanpasu/clash-nyanpasu/releases/tag/v${manifest.version}`, + `https://github.com/LibNyanpasu/clash-nyanpasu/releases/tag/v${update.version}`, ); }} > @@ -106,10 +124,22 @@ export default function UpdaterDialog({ }, }} > - {manifest.body || "New version available."} + {update.body || "New version available."}
+ {contentLength && ( +
+ + + {progress.toFixed(2)}% + +
+ )}
); diff --git a/clash-nyanpasu/frontend/nyanpasu/src/hooks/use-updater.ts b/clash-nyanpasu/frontend/nyanpasu/src/hooks/use-updater.ts index 511e2a6c92..473d376bcd 100644 --- a/clash-nyanpasu/frontend/nyanpasu/src/hooks/use-updater.ts +++ b/clash-nyanpasu/frontend/nyanpasu/src/hooks/use-updater.ts @@ -1,9 +1,9 @@ import { useAtomValue, useSetAtom } from "jotai"; import { useEffect, useState } from "react"; import { OS } from "@/consts"; -import { UpdaterIgnoredAtom, UpdaterManifestAtom } from "@/store/updater"; +import { UpdaterIgnoredAtom, UpdaterInstanceAtom } from "@/store/updater"; import { useNyanpasu } from "@nyanpasu/interface"; -import { checkUpdate } from "@tauri-apps/api/updater"; +import { check as checkUpdate } from "@tauri-apps/plugin-updater"; import { useIsAppImage } from "./use-consts"; export function useUpdaterPlatformSupported() { @@ -26,15 +26,15 @@ export function useUpdaterPlatformSupported() { export default function useUpdater() { const { nyanpasuConfig } = useNyanpasu(); const updaterIgnored = useAtomValue(UpdaterIgnoredAtom); - const setUpdaterManifest = useSetAtom(UpdaterManifestAtom); + const setUpdaterInstance = useSetAtom(UpdaterInstanceAtom); const isPlatformSupported = useUpdaterPlatformSupported(); useEffect(() => { const run = async () => { if (nyanpasuConfig?.enable_auto_check_update && isPlatformSupported) { - const info = await checkUpdate(); - if (info?.shouldUpdate && updaterIgnored !== info.manifest?.version) { - setUpdaterManifest(info.manifest || null); + const updater = await checkUpdate(); + if (updater?.available && updaterIgnored !== updater?.version) { + setUpdaterInstance(updater || null); } } }; @@ -42,7 +42,7 @@ export default function useUpdater() { }, [ isPlatformSupported, nyanpasuConfig?.enable_auto_check_update, - setUpdaterManifest, + setUpdaterInstance, updaterIgnored, ]); } diff --git a/clash-nyanpasu/frontend/nyanpasu/src/pages/_app.tsx b/clash-nyanpasu/frontend/nyanpasu/src/pages/_app.tsx index 78d86f43d6..8efa7f9072 100644 --- a/clash-nyanpasu/frontend/nyanpasu/src/pages/_app.tsx +++ b/clash-nyanpasu/frontend/nyanpasu/src/pages/_app.tsx @@ -56,8 +56,9 @@ export default function App() { }, [breakpoint, setIsDrawer]); useMount(() => { - import("@tauri-apps/api/window") - .then(({ appWindow }) => { + import("@tauri-apps/api/webviewWindow") + .then(({ getCurrentWebviewWindow }) => { + const appWindow = getCurrentWebviewWindow(); appWindow.show(); appWindow.unminimize(); appWindow.setFocus(); diff --git a/clash-nyanpasu/frontend/nyanpasu/src/store/updater.ts b/clash-nyanpasu/frontend/nyanpasu/src/store/updater.ts index d8dc3a5004..70445360f0 100644 --- a/clash-nyanpasu/frontend/nyanpasu/src/store/updater.ts +++ b/clash-nyanpasu/frontend/nyanpasu/src/store/updater.ts @@ -1,10 +1,10 @@ import { atom } from "jotai"; import { atomWithStorage } from "jotai/utils"; -import { UpdateManifest } from "@tauri-apps/api/updater"; +import { type Update } from "@tauri-apps/plugin-updater"; export const UpdaterIgnoredAtom = atomWithStorage( "updaterIgnored", null as string | null, ); -export const UpdaterManifestAtom = atom(null); +export const UpdaterInstanceAtom = atom(null); diff --git a/clash-nyanpasu/frontend/nyanpasu/src/utils/notification.ts b/clash-nyanpasu/frontend/nyanpasu/src/utils/notification.ts index e1719ed382..b18a7ae6c0 100644 --- a/clash-nyanpasu/frontend/nyanpasu/src/utils/notification.ts +++ b/clash-nyanpasu/frontend/nyanpasu/src/utils/notification.ts @@ -3,13 +3,13 @@ import { isPortable } from "@nyanpasu/interface"; import { MessageDialogOptions, message as tauriMessage, -} from "@tauri-apps/api/dialog"; +} from "@tauri-apps/plugin-dialog"; import { isPermissionGranted, Options, requestPermission, sendNotification, -} from "@tauri-apps/api/notification"; +} from "@tauri-apps/plugin-notification"; let permissionGranted: boolean | null = null; let portable: boolean | null = null; diff --git a/clash-nyanpasu/frontend/ui/package.json b/clash-nyanpasu/frontend/ui/package.json index daaa7051d8..90c40b19bd 100644 --- a/clash-nyanpasu/frontend/ui/package.json +++ b/clash-nyanpasu/frontend/ui/package.json @@ -22,7 +22,7 @@ "@mui/material": "5.16.7", "@radix-ui/react-portal": "1.1.1", "@radix-ui/react-scroll-area": "1.1.0", - "@tauri-apps/api": "1.6.0", + "@tauri-apps/api": "2.0.0-rc.4", "@types/d3": "7.4.3", "@types/react": "18.3.5", "@vitejs/plugin-react": "4.3.1", @@ -44,6 +44,6 @@ "sass": "1.78.0", "tailwind-merge": "2.5.2", "typescript-plugin-css-modules": "5.1.0", - "vite-plugin-dts": "4.1.1" + "vite-plugin-dts": "4.2.1" } } diff --git a/clash-nyanpasu/frontend/ui/src/hooks/use-breakpoint.ts b/clash-nyanpasu/frontend/ui/src/hooks/use-breakpoint.ts index 31253de400..ea56d7c18e 100644 --- a/clash-nyanpasu/frontend/ui/src/hooks/use-breakpoint.ts +++ b/clash-nyanpasu/frontend/ui/src/hooks/use-breakpoint.ts @@ -51,7 +51,10 @@ export const useBreakpointValue = ( const [result, setResult] = useState(calculateValue); useAsyncEffect(async () => { - const { appWindow } = await import("@tauri-apps/api/window"); + const { getCurrentWebviewWindow } = await import( + "@tauri-apps/api/webviewWindow" + ); + const appWindow = getCurrentWebviewWindow(); if (!(await appWindow.isMinimized())) { setResult(calculateValue); } diff --git a/clash-nyanpasu/package.json b/clash-nyanpasu/package.json index 3d78c18143..9a1f10ff63 100644 --- a/clash-nyanpasu/package.json +++ b/clash-nyanpasu/package.json @@ -59,7 +59,7 @@ "@commitlint/cli": "19.4.1", "@commitlint/config-conventional": "19.4.1", "@ianvs/prettier-plugin-sort-imports": "4.3.1", - "@tauri-apps/cli": "1.6.1", + "@tauri-apps/cli": "2.0.0-rc.12", "@types/fs-extra": "11.0.4", "@types/lodash-es": "4.17.12", "@types/node": "22.5.4", @@ -103,7 +103,7 @@ "tsx": "4.19.0", "typescript": "5.5.4" }, - "packageManager": "pnpm@9.9.0+sha512.60c18acd138bff695d339be6ad13f7e936eea6745660d4cc4a776d5247c540d0edee1a563695c183a66eb917ef88f2b4feb1fc25f32a7adcadc7aaf3438e99c1", + "packageManager": "pnpm@9.10.0+sha512.73a29afa36a0d092ece5271de5177ecbf8318d454ecd701343131b8ebc0c1a91c487da46ab77c8e596d6acf1461e3594ced4becedf8921b074fbd8653ed7051c", "engines": { "node": "22.8.0" }, diff --git a/clash-nyanpasu/pnpm-lock.yaml b/clash-nyanpasu/pnpm-lock.yaml index 80ab5f32cf..8651ddaac7 100644 --- a/clash-nyanpasu/pnpm-lock.yaml +++ b/clash-nyanpasu/pnpm-lock.yaml @@ -32,8 +32,8 @@ importers: specifier: 4.3.1 version: 4.3.1(prettier@3.3.3) '@tauri-apps/cli': - specifier: 1.6.1 - version: 1.6.1 + specifier: 2.0.0-rc.12 + version: 2.0.0-rc.12 '@types/fs-extra': specifier: 11.0.4 version: 11.0.4 @@ -164,8 +164,8 @@ importers: frontend/interface: dependencies: '@tauri-apps/api': - specifier: 1.6.0 - version: 1.6.0 + specifier: 2.0.0-rc.4 + version: 2.0.0-rc.4 ahooks: specifier: 3.8.1 version: 3.8.1(react@19.0.0-rc-e948a5ac-20240807) @@ -211,7 +211,7 @@ importers: version: 4.6.0(monaco-editor@0.51.0)(react-dom@19.0.0-rc-e948a5ac-20240807(react@19.0.0-rc-e948a5ac-20240807))(react@19.0.0-rc-e948a5ac-20240807) '@mui/icons-material': specifier: 5.16.7 - version: 5.16.7(@mui/material@5.16.7(@emotion/react@11.13.3(react@19.0.0-rc-e948a5ac-20240807)(types-react@19.0.0-rc.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(react@19.0.0-rc-e948a5ac-20240807)(types-react@19.0.0-rc.1))(react@19.0.0-rc-e948a5ac-20240807)(types-react@19.0.0-rc.1))(react@19.0.0-rc-e948a5ac-20240807)(types-react@19.0.0-rc.1))(react@19.0.0-rc-e948a5ac-20240807)(types-react@19.0.0-rc.1) + version: 5.16.7(@mui/material@5.16.7(@emotion/react@11.13.3(react@19.0.0-rc-e948a5ac-20240807)(types-react@19.0.0-rc.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(react@19.0.0-rc-e948a5ac-20240807)(types-react@19.0.0-rc.1))(react@19.0.0-rc-e948a5ac-20240807)(types-react@19.0.0-rc.1))(react-dom@19.0.0-rc-e948a5ac-20240807(react@19.0.0-rc-e948a5ac-20240807))(react@19.0.0-rc-e948a5ac-20240807)(types-react@19.0.0-rc.1))(react@19.0.0-rc-e948a5ac-20240807)(types-react@19.0.0-rc.1) '@mui/lab': specifier: 5.0.0-alpha.173 version: 5.0.0-alpha.173(@emotion/react@11.13.3(react@19.0.0-rc-e948a5ac-20240807)(types-react@19.0.0-rc.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(react@19.0.0-rc-e948a5ac-20240807)(types-react@19.0.0-rc.1))(react@19.0.0-rc-e948a5ac-20240807)(types-react@19.0.0-rc.1))(@mui/material@5.16.7(@emotion/react@11.13.3(react@19.0.0-rc-e948a5ac-20240807)(types-react@19.0.0-rc.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(react@19.0.0-rc-e948a5ac-20240807)(types-react@19.0.0-rc.1))(react@19.0.0-rc-e948a5ac-20240807)(types-react@19.0.0-rc.1))(react-dom@19.0.0-rc-e948a5ac-20240807(react@19.0.0-rc-e948a5ac-20240807))(react@19.0.0-rc-e948a5ac-20240807)(types-react@19.0.0-rc.1))(react-dom@19.0.0-rc-e948a5ac-20240807(react@19.0.0-rc-e948a5ac-20240807))(react@19.0.0-rc-e948a5ac-20240807)(types-react@19.0.0-rc.1) @@ -225,8 +225,8 @@ importers: specifier: workspace:^ version: link:../ui '@tauri-apps/api': - specifier: 1.6.0 - version: 1.6.0 + specifier: 2.0.0-rc.4 + version: 2.0.0-rc.4 '@types/json-schema': specifier: 7.0.15 version: 7.0.15 @@ -310,8 +310,32 @@ importers: specifier: 11.13.3 version: 11.13.3(react@19.0.0-rc-e948a5ac-20240807)(types-react@19.0.0-rc.1) '@iconify/json': - specifier: 2.2.245 - version: 2.2.245 + specifier: 2.2.246 + version: 2.2.246 + '@tauri-apps/plugin-clipboard-manager': + specifier: 2.0.0-rc.1 + version: 2.0.0-rc.1 + '@tauri-apps/plugin-dialog': + specifier: 2.0.0-rc.1 + version: 2.0.0-rc.1 + '@tauri-apps/plugin-fs': + specifier: 2.0.0-rc.2 + version: 2.0.0-rc.2 + '@tauri-apps/plugin-notification': + specifier: 2.0.0-rc.1 + version: 2.0.0-rc.1 + '@tauri-apps/plugin-os': + specifier: 2.0.0-rc.1 + version: 2.0.0-rc.1 + '@tauri-apps/plugin-process': + specifier: 2.0.0-rc.1 + version: 2.0.0-rc.1 + '@tauri-apps/plugin-shell': + specifier: 2.0.0-rc.1 + version: 2.0.0-rc.1 + '@tauri-apps/plugin-updater': + specifier: 2.0.0-rc.2 + version: 2.0.0-rc.2 '@types/react': specifier: npm:types-react@rc version: types-react@19.0.0-rc.1 @@ -328,8 +352,8 @@ importers: specifier: 2.1.1 version: 2.1.1 meta-json-schema: - specifier: libnyanpasu/meta-json-schema#main - version: https://codeload.github.com/libnyanpasu/meta-json-schema/tar.gz/b4b29ee93facde4ca7da6e9c4e0cba50c3c1e074 + specifier: 1.18.8 + version: 1.18.8 monaco-yaml: specifier: 5.2.2 version: 5.2.2(monaco-editor@0.51.0) @@ -374,7 +398,7 @@ importers: version: 0.3.0 '@mui/icons-material': specifier: 5.16.7 - version: 5.16.7(@mui/material@5.16.7(@emotion/react@11.13.3(react@19.0.0-rc-e948a5ac-20240807)(types-react@19.0.0-rc.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(react@19.0.0-rc-e948a5ac-20240807)(types-react@19.0.0-rc.1))(react@19.0.0-rc-e948a5ac-20240807)(types-react@19.0.0-rc.1))(react@19.0.0-rc-e948a5ac-20240807)(types-react@19.0.0-rc.1))(react@19.0.0-rc-e948a5ac-20240807)(types-react@19.0.0-rc.1) + version: 5.16.7(@mui/material@5.16.7(@emotion/react@11.13.3(react@19.0.0-rc-e948a5ac-20240807)(types-react@19.0.0-rc.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(react@19.0.0-rc-e948a5ac-20240807)(types-react@19.0.0-rc.1))(react@19.0.0-rc-e948a5ac-20240807)(types-react@19.0.0-rc.1))(react-dom@19.0.0-rc-e948a5ac-20240807(react@19.0.0-rc-e948a5ac-20240807))(react@19.0.0-rc-e948a5ac-20240807)(types-react@19.0.0-rc.1))(react@19.0.0-rc-e948a5ac-20240807)(types-react@19.0.0-rc.1) '@mui/lab': specifier: 5.0.0-alpha.173 version: 5.0.0-alpha.173(@emotion/react@11.13.3(react@19.0.0-rc-e948a5ac-20240807)(types-react@19.0.0-rc.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(react@19.0.0-rc-e948a5ac-20240807)(types-react@19.0.0-rc.1))(react@19.0.0-rc-e948a5ac-20240807)(types-react@19.0.0-rc.1))(@mui/material@5.16.7(@emotion/react@11.13.3(react@19.0.0-rc-e948a5ac-20240807)(types-react@19.0.0-rc.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(react@19.0.0-rc-e948a5ac-20240807)(types-react@19.0.0-rc.1))(react@19.0.0-rc-e948a5ac-20240807)(types-react@19.0.0-rc.1))(react-dom@19.0.0-rc-e948a5ac-20240807(react@19.0.0-rc-e948a5ac-20240807))(react@19.0.0-rc-e948a5ac-20240807)(types-react@19.0.0-rc.1))(react-dom@19.0.0-rc-e948a5ac-20240807(react@19.0.0-rc-e948a5ac-20240807))(react@19.0.0-rc-e948a5ac-20240807)(types-react@19.0.0-rc.1) @@ -388,8 +412,8 @@ importers: specifier: 1.1.0 version: 1.1.0(react@19.0.0-rc-e948a5ac-20240807)(types-react@19.0.0-rc.1) '@tauri-apps/api': - specifier: 1.6.0 - version: 1.6.0 + specifier: 2.0.0-rc.4 + version: 2.0.0-rc.4 '@types/d3': specifier: 7.4.3 version: 7.4.3 @@ -449,8 +473,8 @@ importers: specifier: 5.1.0 version: 5.1.0(typescript@5.5.4) vite-plugin-dts: - specifier: 4.1.1 - version: 4.1.1(@types/node@22.5.4)(rollup@4.21.0)(typescript@5.5.4)(vite@5.4.3(@types/node@22.5.4)(less@4.2.0)(sass@1.78.0)(stylus@0.62.0)) + specifier: 4.2.1 + version: 4.2.1(@types/node@22.5.4)(rollup@4.21.0)(typescript@5.5.4)(vite@5.4.3(@types/node@22.5.4)(less@4.2.0)(sass@1.78.0)(stylus@0.62.0)) scripts: dependencies: @@ -463,6 +487,9 @@ importers: figlet: specifier: 1.7.0 version: 1.7.0 + p-retry: + specifier: ^6.2.0 + version: 6.2.0 devDependencies: '@octokit/types': specifier: 13.5.0 @@ -1432,8 +1459,8 @@ packages: '@vue/compiler-sfc': optional: true - '@iconify/json@2.2.245': - resolution: {integrity: sha512-JbruddbGKghBe6fE1mzuo5hhUkisIW4mAdQGAyx0Q6sI52ukeQJHakolc2RQD/yWC3xp7rARNXMzWSXJynJ1vw==} + '@iconify/json@2.2.246': + resolution: {integrity: sha512-69/F8EhI4MP1xcpD0rUm09h7o2X2OYfpABe4D53cp4Cr1AYeu90OGJlOTayKqzSh9fPXr3YE8JOyo5LVBiCW0g==} '@iconify/types@2.0.0': resolution: {integrity: sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg==} @@ -1473,11 +1500,11 @@ packages: '@material/material-color-utilities@0.3.0': resolution: {integrity: sha512-ztmtTd6xwnuh2/xu+Vb01btgV8SQWYCaK56CkRK8gEkWe5TuDyBcYJ0wgkMRn+2VcE9KUmhvkz+N9GHrqw/C0g==} - '@microsoft/api-extractor-model@7.29.4': - resolution: {integrity: sha512-LHOMxmT8/tU1IiiiHOdHFF83Qsi+V8d0kLfscG4EvQE9cafiR8blOYr8SfkQKWB1wgEilQgXJX3MIA4vetDLZw==} + '@microsoft/api-extractor-model@7.29.6': + resolution: {integrity: sha512-gC0KGtrZvxzf/Rt9oMYD2dHvtN/1KPEYsrQPyMKhLHnlVuO/f4AFN3E4toqZzD2pt4LhkKoYmL2H9tX3yCOyRw==} - '@microsoft/api-extractor@7.47.4': - resolution: {integrity: sha512-HKm+P4VNzWwvq1Ey+Jfhhj/3MjsD+ka2hbt8L5AcRM95lu1MFOYnz3XlU7Gr79Q/ZhOb7W/imAKeYrOI0bFydg==} + '@microsoft/api-extractor@7.47.7': + resolution: {integrity: sha512-fNiD3G55ZJGhPOBPMKD/enozj8yxJSYyVJWxRWdcUtw842rvthDHJgUWq9gXQTensFlMHv2wGuCjjivPv53j0A==} hasBin: true '@microsoft/tsdoc-config@0.17.0': @@ -2021,46 +2048,55 @@ packages: resolution: {integrity: sha512-pWJsfQjNWNGsoCq53KjMtwdJDmh/6NubwQcz52aEwLEuvx08bzcy6tOUuawAOncPnxz/3siRtd8hiQ32G1y8VA==} cpu: [arm] os: [linux] + libc: [glibc] '@rollup/rollup-linux-arm-musleabihf@4.21.0': resolution: {integrity: sha512-efRIANsz3UHZrnZXuEvxS9LoCOWMGD1rweciD6uJQIx2myN3a8Im1FafZBzh7zk1RJ6oKcR16dU3UPldaKd83w==} cpu: [arm] os: [linux] + libc: [musl] '@rollup/rollup-linux-arm64-gnu@4.21.0': resolution: {integrity: sha512-ZrPhydkTVhyeGTW94WJ8pnl1uroqVHM3j3hjdquwAcWnmivjAwOYjTEAuEDeJvGX7xv3Z9GAvrBkEzCgHq9U1w==} cpu: [arm64] os: [linux] + libc: [glibc] '@rollup/rollup-linux-arm64-musl@4.21.0': resolution: {integrity: sha512-cfaupqd+UEFeURmqNP2eEvXqgbSox/LHOyN9/d2pSdV8xTrjdg3NgOFJCtc1vQ/jEke1qD0IejbBfxleBPHnPw==} cpu: [arm64] os: [linux] + libc: [musl] '@rollup/rollup-linux-powerpc64le-gnu@4.21.0': resolution: {integrity: sha512-ZKPan1/RvAhrUylwBXC9t7B2hXdpb/ufeu22pG2psV7RN8roOfGurEghw1ySmX/CmDDHNTDDjY3lo9hRlgtaHg==} cpu: [ppc64] os: [linux] + libc: [glibc] '@rollup/rollup-linux-riscv64-gnu@4.21.0': resolution: {integrity: sha512-H1eRaCwd5E8eS8leiS+o/NqMdljkcb1d6r2h4fKSsCXQilLKArq6WS7XBLDu80Yz+nMqHVFDquwcVrQmGr28rg==} cpu: [riscv64] os: [linux] + libc: [glibc] '@rollup/rollup-linux-s390x-gnu@4.21.0': resolution: {integrity: sha512-zJ4hA+3b5tu8u7L58CCSI0A9N1vkfwPhWd/puGXwtZlsB5bTkwDNW/+JCU84+3QYmKpLi+XvHdmrlwUwDA6kqw==} cpu: [s390x] os: [linux] + libc: [glibc] '@rollup/rollup-linux-x64-gnu@4.21.0': resolution: {integrity: sha512-e2hrvElFIh6kW/UNBQK/kzqMNY5mO+67YtEh9OA65RM5IJXYTWiXjX6fjIiPaqOkBthYF1EqgiZ6OXKcQsM0hg==} cpu: [x64] os: [linux] + libc: [glibc] '@rollup/rollup-linux-x64-musl@4.21.0': resolution: {integrity: sha512-1vvmgDdUSebVGXWX2lIcgRebqfQSff0hMEkLJyakQ9JQUbLDkEaMsPTLOmyccyC6IJ/l3FZuJbmrBw/u0A0uCQ==} cpu: [x64] os: [linux] + libc: [musl] '@rollup/rollup-win32-arm64-msvc@4.21.0': resolution: {integrity: sha512-s5oFkZ/hFcrlAyBTONFY1TWndfyre1wOMwU+6KCpm/iatybvrRgmZVM+vCFwxmC5ZhdlgfE0N4XorsDpi7/4XQ==} @@ -2077,8 +2113,8 @@ packages: cpu: [x64] os: [win32] - '@rushstack/node-core-library@5.5.1': - resolution: {integrity: sha512-ZutW56qIzH8xIOlfyaLQJFx+8IBqdbVCZdnj+XT1MorQ1JqqxHse8vbCpEM+2MjsrqcbxcgDIbfggB1ZSQ2A3g==} + '@rushstack/node-core-library@5.7.0': + resolution: {integrity: sha512-Ff9Cz/YlWu9ce4dmqNBZpA45AEya04XaBFIjV7xTVeEf+y/kTjEasmozqFELXlNG4ROdevss75JrrZ5WgufDkQ==} peerDependencies: '@types/node': '*' peerDependenciesMeta: @@ -2088,16 +2124,16 @@ packages: '@rushstack/rig-package@0.5.3': resolution: {integrity: sha512-olzSSjYrvCNxUFZowevC3uz8gvKr3WTpHQ7BkpjtRpA3wK+T0ybep/SRUMfr195gBzJm5gaXw0ZMgjIyHqJUow==} - '@rushstack/terminal@0.13.3': - resolution: {integrity: sha512-fc3zjXOw8E0pXS5t9vTiIPx9gHA0fIdTXsu9mT4WbH+P3mYvnrX0iAQ5a6NvyK1+CqYWBTw/wVNx7SDJkI+WYQ==} + '@rushstack/terminal@0.14.0': + resolution: {integrity: sha512-juTKMAMpTIJKudeFkG5slD8Z/LHwNwGZLtU441l/u82XdTBfsP+LbGKJLCNwP5se+DMCT55GB8x9p6+C4UL7jw==} peerDependencies: '@types/node': '*' peerDependenciesMeta: '@types/node': optional: true - '@rushstack/ts-command-line@4.22.3': - resolution: {integrity: sha512-edMpWB3QhFFZ4KtSzS8WNjBgR4PXPPOVrOHMbb7kNpmQ1UFS9HdVtjCXg1H5fG+xYAbeE+TMPcVPUyX2p84STA==} + '@rushstack/ts-command-line@4.22.6': + resolution: {integrity: sha512-QSRqHT/IfoC5nk9zn6+fgyqOPXHME0BfchII9EUPR19pocsNp/xSbeBCbD3PIR2Lg+Q5qk7OFqk1VhWPMdKHJg==} '@shikijs/core@1.16.2': resolution: {integrity: sha512-XSVH5OZCvE4WLMgdoBqfPMYmGHGmCC3OgZhw0S7KcSi2XKZ+5oHGe71GFnTljgdOxvxx5WrRks6QoTLKrl1eAA==} @@ -2205,24 +2241,28 @@ packages: engines: {node: '>=10'} cpu: [arm64] os: [linux] + libc: [glibc] '@swc/core-linux-arm64-musl@1.6.1': resolution: {integrity: sha512-dr6YbLBg/SsNxs1hDqJhxdcrS8dGMlOXJwXIrUvACiA8jAd6S5BxYCaqsCefLYXtaOmu0bbx1FB/evfodqB70Q==} engines: {node: '>=10'} cpu: [arm64] os: [linux] + libc: [musl] '@swc/core-linux-x64-gnu@1.6.1': resolution: {integrity: sha512-A0b/3V+yFy4LXh3O9umIE7LXPC7NBWdjl6AQYqymSMcMu0EOb1/iygA6s6uWhz9y3e172Hpb9b/CGsuD8Px/bg==} engines: {node: '>=10'} cpu: [x64] os: [linux] + libc: [glibc] '@swc/core-linux-x64-musl@1.6.1': resolution: {integrity: sha512-5dJjlzZXhC87nZZZWbpiDP8kBIO0ibis893F/rtPIQBI5poH+iJuA32EU3wN4/WFHeK4et8z6SGSVghPtWyk4g==} engines: {node: '>=10'} cpu: [x64] os: [linux] + libc: [musl] '@swc/core-win32-arm64-msvc@1.6.1': resolution: {integrity: sha512-HBi1ZlwvfcUibLtT3g/lP57FaDPC799AD6InolB2KSgkqyBbZJ9wAXM8/CcH67GLIP0tZ7FqblrJTzGXxetTJQ==} @@ -2291,75 +2331,102 @@ packages: '@taplo/lib@0.4.0-alpha.2': resolution: {integrity: sha512-DV/Re3DPVY+BhBtLZ3dmP4mP6YMLSsgq9qGLXwOV38lvNF/fBlgvQswzlXmzCEefL/3q2eMoefZpOI/+GLuCNA==} - '@tauri-apps/api@1.6.0': - resolution: {integrity: sha512-rqI++FWClU5I2UBp4HXFvl+sBWkdigBkxnpJDQUWttNyG7IZP4FwQGhTNL5EOw0vI8i6eSAJ5frLqO7n7jbJdg==} - engines: {node: '>= 14.6.0', npm: '>= 6.6.0', yarn: '>= 1.19.1'} + '@tauri-apps/api@2.0.0-rc.4': + resolution: {integrity: sha512-UNiIhhKG08j4ooss2oEEVexffmWkgkYlC2M3GcX3VPtNsqFgVNL8Mcw/4Y7rO9M9S+ffAMnLOF5ypzyuyb8tyg==} - '@tauri-apps/cli-darwin-arm64@1.6.1': - resolution: {integrity: sha512-n+16Z9qQksBmY55Xwful8GGrw2dlyeqKPsjuNcwKUgVB5a4gIq6K6uUsbhwMUMUA3gqewQMBn44QXbSe5qNKfA==} + '@tauri-apps/cli-darwin-arm64@2.0.0-rc.12': + resolution: {integrity: sha512-zYxcAH4reyqKkqCAybggszFWkBvC+ZyZPTWFKXXVQ20MZc1q+e/0UJYC8UKsaumrbi1uptgamvnM8yql56x5QQ==} engines: {node: '>= 10'} cpu: [arm64] os: [darwin] - '@tauri-apps/cli-darwin-x64@1.6.1': - resolution: {integrity: sha512-OHzm6qiywv0GEwBDowlzLSuztKE85NMxp2loVynQ4vDoVk6V0jMtQy/N9YvYA0BetvfNTuuAiz3hsTkMHMYm+g==} + '@tauri-apps/cli-darwin-x64@2.0.0-rc.12': + resolution: {integrity: sha512-eme7pQzEzeGCk13V3uxUNRnkVZJukqwHotqEb2RdovXqJWSyESrighBy4PBG5Xn6wNYTOyoquY9+In4TOfJAzw==} engines: {node: '>= 10'} cpu: [x64] os: [darwin] - '@tauri-apps/cli-linux-arm-gnueabihf@1.6.1': - resolution: {integrity: sha512-ZA4ByaiZbrXUbhaoWUVab4lHI2yI1/ucrRO6b9pky6ytgqx37hA/YOWoctD0yaf5giQJQZw160euaBIUOKzRXA==} + '@tauri-apps/cli-linux-arm-gnueabihf@2.0.0-rc.12': + resolution: {integrity: sha512-113T2NsLeoy6GXsqc0yjMoozt+KXzkAtUB7DL9Kcvx9IMfA87cUVaTNjnb2GFsoQqpCWGfHei3nr9n1PGEbwMg==} engines: {node: '>= 10'} cpu: [arm] os: [linux] - '@tauri-apps/cli-linux-arm64-gnu@1.6.1': - resolution: {integrity: sha512-VBU4GRJPU9jzzeqaEGLHAJzqQhpl7WnRFyHPR8Qby0D17av3CClJ7nBa+CI3ob3JbIERfJM9kwFHdY9eQpfxnw==} + '@tauri-apps/cli-linux-arm64-gnu@2.0.0-rc.12': + resolution: {integrity: sha512-9TrUyNg0vmsYF7IbG+/sybEeiz6ikA1Kjd6JjC4iwfXjRff8fuTR7CIOb06imabxbLzGP79qSAnGAeTXz8E7qA==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] + libc: [glibc] - '@tauri-apps/cli-linux-arm64-musl@1.6.1': - resolution: {integrity: sha512-gyMgNZ8fwQFYzrIiHwhmKECkbuAZtzsRyl+bi1Ua11XVWYVUpY8+cNp7Y5ilMJ9AwNFI/HFKjzzua9r+e9FNzw==} + '@tauri-apps/cli-linux-arm64-musl@2.0.0-rc.12': + resolution: {integrity: sha512-YvE40+wdkNcXhwUAJNPyhNzJ8YS3saJoxGj7mtNQeNeNrKhxyj6hA5T6gw9KtMkwBOp+HGtqn+eDXiu0X7BBHQ==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] + libc: [musl] - '@tauri-apps/cli-linux-x64-gnu@1.6.1': - resolution: {integrity: sha512-aYLjLXEBcOf4GUrLBZRQcoLSL3KgCKHwfAyGmTilH4juAw42ZaAYWIZwa59hp2kC4w1XrlmwAzGpi1RESBr5Mw==} + '@tauri-apps/cli-linux-x64-gnu@2.0.0-rc.12': + resolution: {integrity: sha512-q+MJp/lSA5WINs78dCFMlU0/jQeUkGr9GHbKeppcVcpkcY/1vog70b4KhneyvbuklKBn/V8kd0FtIKCn8VP+KQ==} engines: {node: '>= 10'} cpu: [x64] os: [linux] + libc: [glibc] - '@tauri-apps/cli-linux-x64-musl@1.6.1': - resolution: {integrity: sha512-j1M7ovICUrBDbrH8CNUwbMe0zk0/IAR7MXRv5PEanktAZ1w/LG3nlO/AhY5/Cbqqo3ziKTcMpe6x0j3aE8jYOA==} + '@tauri-apps/cli-linux-x64-musl@2.0.0-rc.12': + resolution: {integrity: sha512-5zodtleH2GFsB9lszDYrzPTLcr+MMqtpQpJWHATC1K03bLEA8ia8zSdBqRwm7u8NraMLl8TE7hc7hwq0uxGEcg==} engines: {node: '>= 10'} cpu: [x64] os: [linux] + libc: [musl] - '@tauri-apps/cli-win32-arm64-msvc@1.6.1': - resolution: {integrity: sha512-yCGT1jXHvZtu+yYPDmDOJDfgsj5EKdBPvya+kmN03BmLfOF+8EWHA9s6yXUdk9pSr6M9OQS0SXocbGDOu5AkMw==} + '@tauri-apps/cli-win32-arm64-msvc@2.0.0-rc.12': + resolution: {integrity: sha512-nSu6VHpuq61DYM2YowLDLDwkK8im7dzYxIHXs+h8/rhkmadTujGhbyUhHPI1STA6hNyITUtSFpo6P2mEbfpAIg==} engines: {node: '>= 10'} cpu: [arm64] os: [win32] - '@tauri-apps/cli-win32-ia32-msvc@1.6.1': - resolution: {integrity: sha512-klAt+KNcczC4gxz9vm6tSvFB4iyXVj4r+TtDVhStLCKkAZOVm0ZsFym1kDzltxrB/3xSjgzsgIiEJydN2cP7xw==} + '@tauri-apps/cli-win32-ia32-msvc@2.0.0-rc.12': + resolution: {integrity: sha512-d/4y57OisMuB+MUkTpZsryQRi9ZQXQ8SsMhrvEgu8sbX8/WRm0iZyGuIZ01RlZZHLIasXbKTkPX+hPQC5Juk8Q==} engines: {node: '>= 10'} cpu: [ia32] os: [win32] - '@tauri-apps/cli-win32-x64-msvc@1.6.1': - resolution: {integrity: sha512-WEzQzBgcaqjZoA5M/KOupHmt8W3QQ20vwETXpGEMPd7spj4eZsRv/2ZDuCz4ELbai1XlIsTITFNe2LlJjzqISA==} + '@tauri-apps/cli-win32-x64-msvc@2.0.0-rc.12': + resolution: {integrity: sha512-RsPUvsbFza03ysh0nU2nM3P2CVWz9cu7CRHwOEdtXjWWNREHUYCaVpqQKz0tn2sG19yXiNIB40iqrIBUmb/IoA==} engines: {node: '>= 10'} cpu: [x64] os: [win32] - '@tauri-apps/cli@1.6.1': - resolution: {integrity: sha512-2S8WGmkz54Z9WxpaFVbUYsTiwx5OIEmdD5DDWRygX9VhaWwZg0y6DctsUtCRVre9I/Un/hTnmqkhZqPamCEx8A==} + '@tauri-apps/cli@2.0.0-rc.12': + resolution: {integrity: sha512-rNcVSyGHGz8vNk542isYKPk5fEMAsgmzER+1s9YYbGZCH7m4e0rH89p/P9W40I/Z4AZk4ZqjpEeajeS5izDI4g==} engines: {node: '>= 10'} hasBin: true + '@tauri-apps/plugin-clipboard-manager@2.0.0-rc.1': + resolution: {integrity: sha512-hFgUABMmQuVGKwHb8PR9fuqfk0WRkedbWUt/ZV5sL4Q6kLrsp3JYJvtzVPeMYdeBvMqHl8WXNxAc/zwSld2h9w==} + + '@tauri-apps/plugin-dialog@2.0.0-rc.1': + resolution: {integrity: sha512-H28gh6BfZtjflHQ+HrmWwunDriBI3AQLAKnMs50GA6zeNUULqbQr7VXbAAKeJL/0CmWcecID4PKXVoSlaWRhEg==} + + '@tauri-apps/plugin-fs@2.0.0-rc.2': + resolution: {integrity: sha512-TFjCfso3tN4b5s2EBjqP8N2gYrPh93Ds3VNKj8pCXv4wbvnItyfG0aHO0haUsedBOHQryDwv9vDAdPX6/T0a+g==} + + '@tauri-apps/plugin-notification@2.0.0-rc.1': + resolution: {integrity: sha512-ddDj7xM8XR7Zv2vdpofNXlLjcp49p/VjlL0D+/eBcMuyooaLNMor3jz/+H6s23iHerdxMWA50mzy26BRN1BySA==} + + '@tauri-apps/plugin-os@2.0.0-rc.1': + resolution: {integrity: sha512-PV8zlSTmYfiN2xzILUmlDSEycS7UYbH2yXk/ZqF+qQU6/s+OVQvmSth4EhllFjcpvPbtqELvpzfjw+2qEouchA==} + + '@tauri-apps/plugin-process@2.0.0-rc.1': + resolution: {integrity: sha512-Bl22xdoiu+AqEP6rzjb7DUJwdLDnejuRFukpkdrqF1/VEWJK5PuE903l+8mIOsd17zZ1Ua8y8WaBWnOXx4QHmw==} + + '@tauri-apps/plugin-shell@2.0.0-rc.1': + resolution: {integrity: sha512-JtNROc0rqEwN/g93ig5pK4cl1vUo2yn+osCpY9de64cy/d9hRzof7AuYOgvt/Xcd5VPQmlgo2AGvUh5sQRSR1A==} + + '@tauri-apps/plugin-updater@2.0.0-rc.2': + resolution: {integrity: sha512-Ngvpa/km/00KASvOsFqRQbVf/6BaAX/gYwQs9eFxjygDpxxlZkZDVP1Fg0urW8s5dY7ELD6UAFB/ZI/g8D0QvQ==} + '@trivago/prettier-plugin-sort-imports@4.3.0': resolution: {integrity: sha512-r3n0onD3BTOVUNPhR4lhVK4/pABGpbA7bW3eumZnYdKaHkf1qEC+Mag6DPbGNuuh0eG8AaYj+YqmVHSiGslaTQ==} peerDependencies: @@ -2573,6 +2640,9 @@ packages: '@types/responselike@1.0.3': resolution: {integrity: sha512-H/+L+UkTV33uf49PH5pCAUBVPNj2nDBXTN+qS1dOwyyg24l3CcicicCA7ca+HMvJBZcFgl5r8e+RR6elsb4Lyw==} + '@types/retry@0.12.2': + resolution: {integrity: sha512-XISRgDJ2Tc5q4TRqvgJtzsRkFYNJzZrhTdtMoGVBttwzzQJkPnS3WWTFc7kuDRoPtPakl+T+OfdEUjYJj7Jbow==} + '@types/unist@2.0.10': resolution: {integrity: sha512-IfYcSBWE3hLpBg8+X2SEa8LVkJdJEkT2Ese2aaLs3ptGdVtABxndrMaxuFlQ1qdFf9Q5rDvDpxI3WwgvKFAsQA==} @@ -2653,14 +2723,14 @@ packages: peerDependencies: vite: ^4.2.0 || ^5.0.0 - '@volar/language-core@2.4.0': - resolution: {integrity: sha512-FTla+khE+sYK0qJP+6hwPAAUwiNHVMph4RUXpxf/FIPKUP61NFrVZorml4mjFShnueR2y9/j8/vnh09YwVdH7A==} + '@volar/language-core@2.4.4': + resolution: {integrity: sha512-kO9k4kTLfxpg+6lq7/KAIv3m2d62IHuCL6GbVgYZTpfKvIGoAIlDxK7pFcB/eczN2+ydg/vnyaeZ6SGyZrJw2w==} - '@volar/source-map@2.4.0': - resolution: {integrity: sha512-2ceY8/NEZvN6F44TXw2qRP6AQsvCYhV2bxaBPWxV9HqIfkbRydSksTFObCF1DBDNBfKiZTS8G/4vqV6cvjdOIQ==} + '@volar/source-map@2.4.4': + resolution: {integrity: sha512-xG3PZqOP2haG8XG4Pg3PD1UGDAdqZg24Ru8c/qYjYAnmcj6GBR64mstx+bZux5QOyRaJK+/lNM/RnpvBD3489g==} - '@volar/typescript@2.4.0': - resolution: {integrity: sha512-9zx3lQWgHmVd+JRRAHUSRiEhe4TlzL7U7e6ulWXOxHH/WNYxzKwCvZD7WYWEZFdw4dHfTD9vUR0yPQO6GilCaQ==} + '@volar/typescript@2.4.4': + resolution: {integrity: sha512-QQMQRVj0fVHJ3XdRKiS1LclhG0VBXdFYlyuHRQF/xLk2PuJuHNWP26MDZNvEVCvnyUQuUQhIAfylwY5TGPgc6w==} '@vue/compiler-core@3.4.38': resolution: {integrity: sha512-8IQOTCWnLFqfHzOGm9+P8OPSEDukgg3Huc92qSG49if/xI2SAwLHQO2qaPQbjCWPBcQoO1WYfXfTACUrWV3c5A==} @@ -2671,8 +2741,8 @@ packages: '@vue/compiler-vue2@2.7.16': resolution: {integrity: sha512-qYC3Psj9S/mfu9uVi5WvNZIzq+xnXMhOwbTFKKDD7b1lhpnn71jXSFdTQ+WsIEk0ONCd7VV2IMm7ONl6tbQ86A==} - '@vue/language-core@2.0.29': - resolution: {integrity: sha512-o2qz9JPjhdoVj8D2+9bDXbaI4q2uZTHQA/dbyZT4Bj1FR9viZxDJnLcKVHfxdn6wsOzRgpqIzJEEmSSvgMvDTQ==} + '@vue/language-core@2.1.6': + resolution: {integrity: sha512-MW569cSky9R/ooKMh6xa2g1D0AtRKbL56k83dzus/bx//RDJk24RHWkMzbAlXjMdDNyxAaagKPRquBIxkxlCkg==} peerDependencies: typescript: '*' peerDependenciesMeta: @@ -4470,6 +4540,10 @@ packages: resolution: {integrity: sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==} engines: {node: '>= 0.4'} + is-network-error@1.1.0: + resolution: {integrity: sha512-tUdRRAnhT+OtCZR/LxZelH/C7QtjtFrTu5tXCA8pl55eTUElUHT+GPYV8MBMBvea/j+NxQqVt3LbWMRir7Gx9g==} + engines: {node: '>=16'} + is-npm@1.0.0: resolution: {integrity: sha512-9r39FIr3d+KD9SbX0sfMsHzb5PP3uimOiwr3YupUaUFG4W0l1U57Rx3utpttV7qz5U3jmrO5auUa04LU9pyHsg==} engines: {node: '>=0.10.0'} @@ -4910,9 +4984,8 @@ packages: resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} engines: {node: '>= 8'} - meta-json-schema@https://codeload.github.com/libnyanpasu/meta-json-schema/tar.gz/b4b29ee93facde4ca7da6e9c4e0cba50c3c1e074: - resolution: {tarball: https://codeload.github.com/libnyanpasu/meta-json-schema/tar.gz/b4b29ee93facde4ca7da6e9c4e0cba50c3c1e074} - version: 1.18.7 + meta-json-schema@1.18.8: + resolution: {integrity: sha512-HrYXfSkCUMDFiXSzO2Tmro/ICIyTFjhZ0tH6UiFWl6xfnnHaafjbG6z2f04B/zJE2CAfi2LjQZycEHf0hk9JEQ==} micromark-core-commonmark@2.0.1: resolution: {integrity: sha512-CUQyKr1e///ZODyD1U3xit6zXwy1a8q2a1S1HKtIlmgvurrEpaw/Y9y6KSIbF8P59cn/NjzHyO+Q2fAyYLQrAA==} @@ -5285,6 +5358,10 @@ packages: resolution: {integrity: sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==} engines: {node: '>=10'} + p-retry@6.2.0: + resolution: {integrity: sha512-JA6nkq6hKyWLLasXQXUrO4z8BUZGUt/LjlJxx8Gb2+2ntodU/SS63YZ8b0LUTbQ8ZB9iwOfhEPhg4ykKnn2KsA==} + engines: {node: '>=16.17'} + p-timeout@3.2.0: resolution: {integrity: sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg==} engines: {node: '>=8'} @@ -5888,6 +5965,10 @@ packages: resolution: {integrity: sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA==} engines: {node: '>=18'} + retry@0.13.1: + resolution: {integrity: sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==} + engines: {node: '>= 4'} + reusify@1.0.4: resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} engines: {iojs: '>=1.0.0', node: '>=0.10.0'} @@ -6673,8 +6754,8 @@ packages: vue: optional: true - vite-plugin-dts@4.1.1: - resolution: {integrity: sha512-SxYXwJQbAZ1IMtGEcOuzzZtDWCdcV2JkU7esvpPA8E5tIWVcJB42rZwN9EdULicWGLfaXrUgPIGVSidXBTae2Q==} + vite-plugin-dts@4.2.1: + resolution: {integrity: sha512-/QlYvgUMiv8+ZTEerhNCYnYaZMM07cdlX6hQCR/w/g/nTh0tUXPoYwbT6SitizLJ9BybT1lnrcZgqheI6wromQ==} engines: {node: ^14.18.0 || >=16.0.0} peerDependencies: typescript: '*' @@ -6761,12 +6842,6 @@ packages: vscode-uri@3.0.8: resolution: {integrity: sha512-AyFQ0EVmsOZOlAnxoFOGOq1SQDWAB7C6aqMGS23svWAllfOaxbuFvcT8D1i8z3Gyn8fraVeZNNmN6e9bxxXkKw==} - vue-tsc@2.0.29: - resolution: {integrity: sha512-MHhsfyxO3mYShZCGYNziSbc63x7cQ5g9kvijV7dRe1TTXBRLxXyL0FnXWpUF1xII2mJ86mwYpYsUmMwkmerq7Q==} - hasBin: true - peerDependencies: - typescript: '>=5.0.0' - wcwidth@1.0.1: resolution: {integrity: sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==} @@ -7833,7 +7908,7 @@ snapshots: transitivePeerDependencies: - supports-color - '@iconify/json@2.2.245': + '@iconify/json@2.2.246': dependencies: '@iconify/types': 2.0.0 pathe: 1.1.2 @@ -7886,23 +7961,23 @@ snapshots: '@material/material-color-utilities@0.3.0': {} - '@microsoft/api-extractor-model@7.29.4(@types/node@22.5.4)': + '@microsoft/api-extractor-model@7.29.6(@types/node@22.5.4)': dependencies: '@microsoft/tsdoc': 0.15.0 '@microsoft/tsdoc-config': 0.17.0 - '@rushstack/node-core-library': 5.5.1(@types/node@22.5.4) + '@rushstack/node-core-library': 5.7.0(@types/node@22.5.4) transitivePeerDependencies: - '@types/node' - '@microsoft/api-extractor@7.47.4(@types/node@22.5.4)': + '@microsoft/api-extractor@7.47.7(@types/node@22.5.4)': dependencies: - '@microsoft/api-extractor-model': 7.29.4(@types/node@22.5.4) + '@microsoft/api-extractor-model': 7.29.6(@types/node@22.5.4) '@microsoft/tsdoc': 0.15.0 '@microsoft/tsdoc-config': 0.17.0 - '@rushstack/node-core-library': 5.5.1(@types/node@22.5.4) + '@rushstack/node-core-library': 5.7.0(@types/node@22.5.4) '@rushstack/rig-package': 0.5.3 - '@rushstack/terminal': 0.13.3(@types/node@22.5.4) - '@rushstack/ts-command-line': 4.22.3(@types/node@22.5.4) + '@rushstack/terminal': 0.14.0(@types/node@22.5.4) + '@rushstack/ts-command-line': 4.22.6(@types/node@22.5.4) lodash: 4.17.21 minimatch: 3.0.8 resolve: 1.22.8 @@ -7949,7 +8024,7 @@ snapshots: '@mui/core-downloads-tracker@5.16.7': {} - '@mui/icons-material@5.16.7(@mui/material@5.16.7(@emotion/react@11.13.3(react@19.0.0-rc-e948a5ac-20240807)(types-react@19.0.0-rc.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(react@19.0.0-rc-e948a5ac-20240807)(types-react@19.0.0-rc.1))(react@19.0.0-rc-e948a5ac-20240807)(types-react@19.0.0-rc.1))(react@19.0.0-rc-e948a5ac-20240807)(types-react@19.0.0-rc.1))(react@19.0.0-rc-e948a5ac-20240807)(types-react@19.0.0-rc.1)': + '@mui/icons-material@5.16.7(@mui/material@5.16.7(@emotion/react@11.13.3(react@19.0.0-rc-e948a5ac-20240807)(types-react@19.0.0-rc.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(react@19.0.0-rc-e948a5ac-20240807)(types-react@19.0.0-rc.1))(react@19.0.0-rc-e948a5ac-20240807)(types-react@19.0.0-rc.1))(react-dom@19.0.0-rc-e948a5ac-20240807(react@19.0.0-rc-e948a5ac-20240807))(react@19.0.0-rc-e948a5ac-20240807)(types-react@19.0.0-rc.1))(react@19.0.0-rc-e948a5ac-20240807)(types-react@19.0.0-rc.1)': dependencies: '@babel/runtime': 7.24.8 '@mui/material': 5.16.7(@emotion/react@11.13.3(react@19.0.0-rc-e948a5ac-20240807)(types-react@19.0.0-rc.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(react@19.0.0-rc-e948a5ac-20240807)(types-react@19.0.0-rc.1))(react@19.0.0-rc-e948a5ac-20240807)(types-react@19.0.0-rc.1))(react-dom@19.0.0-rc-e948a5ac-20240807(react@19.0.0-rc-e948a5ac-20240807))(react@19.0.0-rc-e948a5ac-20240807)(types-react@19.0.0-rc.1) @@ -8470,7 +8545,7 @@ snapshots: '@rollup/rollup-win32-x64-msvc@4.21.0': optional: true - '@rushstack/node-core-library@5.5.1(@types/node@22.5.4)': + '@rushstack/node-core-library@5.7.0(@types/node@22.5.4)': dependencies: ajv: 8.13.0 ajv-draft-04: 1.0.0(ajv@8.13.0) @@ -8488,16 +8563,16 @@ snapshots: resolve: 1.22.8 strip-json-comments: 3.1.1 - '@rushstack/terminal@0.13.3(@types/node@22.5.4)': + '@rushstack/terminal@0.14.0(@types/node@22.5.4)': dependencies: - '@rushstack/node-core-library': 5.5.1(@types/node@22.5.4) + '@rushstack/node-core-library': 5.7.0(@types/node@22.5.4) supports-color: 8.1.1 optionalDependencies: '@types/node': 22.5.4 - '@rushstack/ts-command-line@4.22.3(@types/node@22.5.4)': + '@rushstack/ts-command-line@4.22.6(@types/node@22.5.4)': dependencies: - '@rushstack/terminal': 0.13.3(@types/node@22.5.4) + '@rushstack/terminal': 0.14.0(@types/node@22.5.4) '@types/argparse': 1.0.38 argparse: 1.0.10 string-argv: 0.3.2 @@ -8671,50 +8746,82 @@ snapshots: dependencies: '@taplo/core': 0.1.1 - '@tauri-apps/api@1.6.0': {} + '@tauri-apps/api@2.0.0-rc.4': {} - '@tauri-apps/cli-darwin-arm64@1.6.1': + '@tauri-apps/cli-darwin-arm64@2.0.0-rc.12': optional: true - '@tauri-apps/cli-darwin-x64@1.6.1': + '@tauri-apps/cli-darwin-x64@2.0.0-rc.12': optional: true - '@tauri-apps/cli-linux-arm-gnueabihf@1.6.1': + '@tauri-apps/cli-linux-arm-gnueabihf@2.0.0-rc.12': optional: true - '@tauri-apps/cli-linux-arm64-gnu@1.6.1': + '@tauri-apps/cli-linux-arm64-gnu@2.0.0-rc.12': optional: true - '@tauri-apps/cli-linux-arm64-musl@1.6.1': + '@tauri-apps/cli-linux-arm64-musl@2.0.0-rc.12': optional: true - '@tauri-apps/cli-linux-x64-gnu@1.6.1': + '@tauri-apps/cli-linux-x64-gnu@2.0.0-rc.12': optional: true - '@tauri-apps/cli-linux-x64-musl@1.6.1': + '@tauri-apps/cli-linux-x64-musl@2.0.0-rc.12': optional: true - '@tauri-apps/cli-win32-arm64-msvc@1.6.1': + '@tauri-apps/cli-win32-arm64-msvc@2.0.0-rc.12': optional: true - '@tauri-apps/cli-win32-ia32-msvc@1.6.1': + '@tauri-apps/cli-win32-ia32-msvc@2.0.0-rc.12': optional: true - '@tauri-apps/cli-win32-x64-msvc@1.6.1': + '@tauri-apps/cli-win32-x64-msvc@2.0.0-rc.12': optional: true - '@tauri-apps/cli@1.6.1': + '@tauri-apps/cli@2.0.0-rc.12': optionalDependencies: - '@tauri-apps/cli-darwin-arm64': 1.6.1 - '@tauri-apps/cli-darwin-x64': 1.6.1 - '@tauri-apps/cli-linux-arm-gnueabihf': 1.6.1 - '@tauri-apps/cli-linux-arm64-gnu': 1.6.1 - '@tauri-apps/cli-linux-arm64-musl': 1.6.1 - '@tauri-apps/cli-linux-x64-gnu': 1.6.1 - '@tauri-apps/cli-linux-x64-musl': 1.6.1 - '@tauri-apps/cli-win32-arm64-msvc': 1.6.1 - '@tauri-apps/cli-win32-ia32-msvc': 1.6.1 - '@tauri-apps/cli-win32-x64-msvc': 1.6.1 + '@tauri-apps/cli-darwin-arm64': 2.0.0-rc.12 + '@tauri-apps/cli-darwin-x64': 2.0.0-rc.12 + '@tauri-apps/cli-linux-arm-gnueabihf': 2.0.0-rc.12 + '@tauri-apps/cli-linux-arm64-gnu': 2.0.0-rc.12 + '@tauri-apps/cli-linux-arm64-musl': 2.0.0-rc.12 + '@tauri-apps/cli-linux-x64-gnu': 2.0.0-rc.12 + '@tauri-apps/cli-linux-x64-musl': 2.0.0-rc.12 + '@tauri-apps/cli-win32-arm64-msvc': 2.0.0-rc.12 + '@tauri-apps/cli-win32-ia32-msvc': 2.0.0-rc.12 + '@tauri-apps/cli-win32-x64-msvc': 2.0.0-rc.12 + + '@tauri-apps/plugin-clipboard-manager@2.0.0-rc.1': + dependencies: + '@tauri-apps/api': 2.0.0-rc.4 + + '@tauri-apps/plugin-dialog@2.0.0-rc.1': + dependencies: + '@tauri-apps/api': 2.0.0-rc.4 + + '@tauri-apps/plugin-fs@2.0.0-rc.2': + dependencies: + '@tauri-apps/api': 2.0.0-rc.4 + + '@tauri-apps/plugin-notification@2.0.0-rc.1': + dependencies: + '@tauri-apps/api': 2.0.0-rc.4 + + '@tauri-apps/plugin-os@2.0.0-rc.1': + dependencies: + '@tauri-apps/api': 2.0.0-rc.4 + + '@tauri-apps/plugin-process@2.0.0-rc.1': + dependencies: + '@tauri-apps/api': 2.0.0-rc.4 + + '@tauri-apps/plugin-shell@2.0.0-rc.1': + dependencies: + '@tauri-apps/api': 2.0.0-rc.4 + + '@tauri-apps/plugin-updater@2.0.0-rc.2': + dependencies: + '@tauri-apps/api': 2.0.0-rc.4 '@trivago/prettier-plugin-sort-imports@4.3.0(prettier@3.3.3)': dependencies: @@ -8973,6 +9080,8 @@ snapshots: dependencies: '@types/node': 22.5.4 + '@types/retry@0.12.2': {} + '@types/unist@2.0.10': {} '@types/unist@3.0.2': {} @@ -9083,15 +9192,15 @@ snapshots: transitivePeerDependencies: - supports-color - '@volar/language-core@2.4.0': + '@volar/language-core@2.4.4': dependencies: - '@volar/source-map': 2.4.0 + '@volar/source-map': 2.4.4 - '@volar/source-map@2.4.0': {} + '@volar/source-map@2.4.4': {} - '@volar/typescript@2.4.0': + '@volar/typescript@2.4.4': dependencies: - '@volar/language-core': 2.4.0 + '@volar/language-core': 2.4.4 path-browserify: 1.0.1 vscode-uri: 3.0.8 @@ -9113,9 +9222,9 @@ snapshots: de-indent: 1.0.2 he: 1.2.0 - '@vue/language-core@2.0.29(typescript@5.5.4)': + '@vue/language-core@2.1.6(typescript@5.5.4)': dependencies: - '@volar/language-core': 2.4.0 + '@volar/language-core': 2.4.4 '@vue/compiler-dom': 3.4.38 '@vue/compiler-vue2': 2.7.16 '@vue/shared': 3.4.38 @@ -11181,6 +11290,8 @@ snapshots: is-negative-zero@2.0.3: {} + is-network-error@1.1.0: {} + is-npm@1.0.0: {} is-number-object@1.0.7: @@ -11534,7 +11645,7 @@ snapshots: dependencies: '@emotion/react': 11.13.3(react@19.0.0-rc-e948a5ac-20240807)(types-react@19.0.0-rc.1) '@emotion/styled': 11.13.0(@emotion/react@11.13.3(react@19.0.0-rc-e948a5ac-20240807)(types-react@19.0.0-rc.1))(react@19.0.0-rc-e948a5ac-20240807)(types-react@19.0.0-rc.1) - '@mui/icons-material': 5.16.7(@mui/material@5.16.7(@emotion/react@11.13.3(react@19.0.0-rc-e948a5ac-20240807)(types-react@19.0.0-rc.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(react@19.0.0-rc-e948a5ac-20240807)(types-react@19.0.0-rc.1))(react@19.0.0-rc-e948a5ac-20240807)(types-react@19.0.0-rc.1))(react@19.0.0-rc-e948a5ac-20240807)(types-react@19.0.0-rc.1))(react@19.0.0-rc-e948a5ac-20240807)(types-react@19.0.0-rc.1) + '@mui/icons-material': 5.16.7(@mui/material@5.16.7(@emotion/react@11.13.3(react@19.0.0-rc-e948a5ac-20240807)(types-react@19.0.0-rc.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(react@19.0.0-rc-e948a5ac-20240807)(types-react@19.0.0-rc.1))(react@19.0.0-rc-e948a5ac-20240807)(types-react@19.0.0-rc.1))(react-dom@19.0.0-rc-e948a5ac-20240807(react@19.0.0-rc-e948a5ac-20240807))(react@19.0.0-rc-e948a5ac-20240807)(types-react@19.0.0-rc.1))(react@19.0.0-rc-e948a5ac-20240807)(types-react@19.0.0-rc.1) '@mui/material': 5.16.7(@emotion/react@11.13.3(react@19.0.0-rc-e948a5ac-20240807)(types-react@19.0.0-rc.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(react@19.0.0-rc-e948a5ac-20240807)(types-react@19.0.0-rc.1))(react@19.0.0-rc-e948a5ac-20240807)(types-react@19.0.0-rc.1))(react-dom@19.0.0-rc-e948a5ac-20240807(react@19.0.0-rc-e948a5ac-20240807))(react@19.0.0-rc-e948a5ac-20240807)(types-react@19.0.0-rc.1) '@mui/x-date-pickers': 7.9.0(@emotion/react@11.13.3(react@19.0.0-rc-e948a5ac-20240807)(types-react@19.0.0-rc.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(react@19.0.0-rc-e948a5ac-20240807)(types-react@19.0.0-rc.1))(react@19.0.0-rc-e948a5ac-20240807)(types-react@19.0.0-rc.1))(@mui/material@5.16.7(@emotion/react@11.13.3(react@19.0.0-rc-e948a5ac-20240807)(types-react@19.0.0-rc.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(react@19.0.0-rc-e948a5ac-20240807)(types-react@19.0.0-rc.1))(react@19.0.0-rc-e948a5ac-20240807)(types-react@19.0.0-rc.1))(react-dom@19.0.0-rc-e948a5ac-20240807(react@19.0.0-rc-e948a5ac-20240807))(react@19.0.0-rc-e948a5ac-20240807)(types-react@19.0.0-rc.1))(dayjs@1.11.13)(react-dom@19.0.0-rc-e948a5ac-20240807(react@19.0.0-rc-e948a5ac-20240807))(react@19.0.0-rc-e948a5ac-20240807)(types-react@19.0.0-rc.1) '@tanstack/match-sorter-utils': 8.19.4 @@ -11649,7 +11760,7 @@ snapshots: merge2@1.4.1: {} - meta-json-schema@https://codeload.github.com/libnyanpasu/meta-json-schema/tar.gz/b4b29ee93facde4ca7da6e9c4e0cba50c3c1e074: {} + meta-json-schema@1.18.8: {} micromark-core-commonmark@2.0.1: dependencies: @@ -12096,6 +12207,12 @@ snapshots: dependencies: aggregate-error: 3.1.0 + p-retry@6.2.0: + dependencies: + '@types/retry': 0.12.2 + is-network-error: 1.1.0 + retry: 0.13.1 + p-timeout@3.2.0: dependencies: p-finally: 1.0.0 @@ -12456,7 +12573,7 @@ snapshots: react: 19.0.0-rc-e948a5ac-20240807 react-hook-form: 7.52.1(react@19.0.0-rc-e948a5ac-20240807) optionalDependencies: - '@mui/icons-material': 5.16.7(@mui/material@5.16.7(@emotion/react@11.13.3(react@19.0.0-rc-e948a5ac-20240807)(types-react@19.0.0-rc.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(react@19.0.0-rc-e948a5ac-20240807)(types-react@19.0.0-rc.1))(react@19.0.0-rc-e948a5ac-20240807)(types-react@19.0.0-rc.1))(react@19.0.0-rc-e948a5ac-20240807)(types-react@19.0.0-rc.1))(react@19.0.0-rc-e948a5ac-20240807)(types-react@19.0.0-rc.1) + '@mui/icons-material': 5.16.7(@mui/material@5.16.7(@emotion/react@11.13.3(react@19.0.0-rc-e948a5ac-20240807)(types-react@19.0.0-rc.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(react@19.0.0-rc-e948a5ac-20240807)(types-react@19.0.0-rc.1))(react@19.0.0-rc-e948a5ac-20240807)(types-react@19.0.0-rc.1))(react-dom@19.0.0-rc-e948a5ac-20240807(react@19.0.0-rc-e948a5ac-20240807))(react@19.0.0-rc-e948a5ac-20240807)(types-react@19.0.0-rc.1))(react@19.0.0-rc-e948a5ac-20240807)(types-react@19.0.0-rc.1) '@mui/x-date-pickers': 7.9.0(@emotion/react@11.13.3(react@19.0.0-rc-e948a5ac-20240807)(types-react@19.0.0-rc.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(react@19.0.0-rc-e948a5ac-20240807)(types-react@19.0.0-rc.1))(react@19.0.0-rc-e948a5ac-20240807)(types-react@19.0.0-rc.1))(@mui/material@5.16.7(@emotion/react@11.13.3(react@19.0.0-rc-e948a5ac-20240807)(types-react@19.0.0-rc.1))(@emotion/styled@11.13.0(@emotion/react@11.13.3(react@19.0.0-rc-e948a5ac-20240807)(types-react@19.0.0-rc.1))(react@19.0.0-rc-e948a5ac-20240807)(types-react@19.0.0-rc.1))(react-dom@19.0.0-rc-e948a5ac-20240807(react@19.0.0-rc-e948a5ac-20240807))(react@19.0.0-rc-e948a5ac-20240807)(types-react@19.0.0-rc.1))(dayjs@1.11.13)(react-dom@19.0.0-rc-e948a5ac-20240807(react@19.0.0-rc-e948a5ac-20240807))(react@19.0.0-rc-e948a5ac-20240807)(types-react@19.0.0-rc.1) react-hook-form@7.52.1(react@19.0.0-rc-e948a5ac-20240807): @@ -12652,6 +12769,8 @@ snapshots: onetime: 7.0.0 signal-exit: 4.1.0 + retry@0.13.1: {} + reusify@1.0.4: {} rfdc@1.4.1: {} @@ -13594,19 +13713,18 @@ snapshots: react: 19.0.0-rc-e948a5ac-20240807 react-dom: 19.0.0-rc-e948a5ac-20240807(react@19.0.0-rc-e948a5ac-20240807) - vite-plugin-dts@4.1.1(@types/node@22.5.4)(rollup@4.21.0)(typescript@5.5.4)(vite@5.4.3(@types/node@22.5.4)(less@4.2.0)(sass@1.78.0)(stylus@0.62.0)): + vite-plugin-dts@4.2.1(@types/node@22.5.4)(rollup@4.21.0)(typescript@5.5.4)(vite@5.4.3(@types/node@22.5.4)(less@4.2.0)(sass@1.78.0)(stylus@0.62.0)): dependencies: - '@microsoft/api-extractor': 7.47.4(@types/node@22.5.4) + '@microsoft/api-extractor': 7.47.7(@types/node@22.5.4) '@rollup/pluginutils': 5.1.0(rollup@4.21.0) - '@volar/typescript': 2.4.0 - '@vue/language-core': 2.0.29(typescript@5.5.4) + '@volar/typescript': 2.4.4 + '@vue/language-core': 2.1.6(typescript@5.5.4) compare-versions: 6.1.1 debug: 4.3.7 kolorist: 1.8.0 local-pkg: 0.5.0 magic-string: 0.30.11 typescript: 5.5.4 - vue-tsc: 2.0.29(typescript@5.5.4) optionalDependencies: vite: 5.4.3(@types/node@22.5.4)(less@4.2.0)(sass@1.78.0)(stylus@0.62.0) transitivePeerDependencies: @@ -13676,13 +13794,6 @@ snapshots: vscode-uri@3.0.8: {} - vue-tsc@2.0.29(typescript@5.5.4): - dependencies: - '@volar/typescript': 2.4.0 - '@vue/language-core': 2.0.29(typescript@5.5.4) - semver: 7.6.3 - typescript: 5.5.4 - wcwidth@1.0.1: dependencies: defaults: 1.0.4 diff --git a/clash-nyanpasu/scripts/check.ts b/clash-nyanpasu/scripts/check.ts index 4ea88629ee..05cba25974 100644 --- a/clash-nyanpasu/scripts/check.ts +++ b/clash-nyanpasu/scripts/check.ts @@ -16,6 +16,7 @@ const ARCH = process.argv.includes("--arch") // cross platform build support if (!SIDECAR_HOST) { consola.fatal(colorize`{red.bold SIDECAR_HOST} not found`); + process.exit(1); } else { consola.debug(colorize`sidecar-host {yellow ${SIDECAR_HOST}}`); } @@ -77,6 +78,7 @@ async function runTask() { if (i === task.retry - 1) { consola.fatal(`task::${task.name} failed`, err); + process.exit(1); } } } diff --git a/clash-nyanpasu/scripts/osx-aarch64-upload.ts b/clash-nyanpasu/scripts/osx-aarch64-upload.ts index fe99e2f96e..ff1d8798b0 100644 --- a/clash-nyanpasu/scripts/osx-aarch64-upload.ts +++ b/clash-nyanpasu/scripts/osx-aarch64-upload.ts @@ -12,11 +12,11 @@ async function resolve() { if (!process.env.GITHUB_TOKEN) { throw new Error("GITHUB_TOKEN is required"); } - if (!process.env.TAURI_PRIVATE_KEY) { - throw new Error("TAURI_PRIVATE_KEY is required"); + if (!process.env.TAURI_SIGNING_PRIVATE_KEY) { + throw new Error("TAURI_SIGNING_PRIVATE_KEY is required"); } - if (!process.env.TAURI_KEY_PASSWORD) { - throw new Error("TAURI_KEY_PASSWORD is required"); + if (!process.env.TAURI_SIGNING_PRIVATE_KEY_PASSWORD) { + throw new Error("TAURI_SIGNING_PRIVATE_KEY_PASSWORD is required"); } const { version } = pkgJson; diff --git a/clash-nyanpasu/scripts/package.json b/clash-nyanpasu/scripts/package.json index 07d0c5c82b..b06d8b019b 100644 --- a/clash-nyanpasu/scripts/package.json +++ b/clash-nyanpasu/scripts/package.json @@ -5,7 +5,8 @@ "dependencies": { "@actions/github": "6.0.0", "@types/figlet": "1.5.8", - "figlet": "1.7.0" + "figlet": "1.7.0", + "p-retry": "^6.2.0" }, "devDependencies": { "@octokit/types": "13.5.0", diff --git a/clash-nyanpasu/scripts/portable.ts b/clash-nyanpasu/scripts/portable.ts index 1aed6b22df..227645203f 100644 --- a/clash-nyanpasu/scripts/portable.ts +++ b/clash-nyanpasu/scripts/portable.ts @@ -21,8 +21,11 @@ async function resolvePortable() { await fs.createFile(path.join(configDir, "PORTABLE")); const zip = new AdmZip(); - - zip.addLocalFile(path.join(releaseDir, "Clash Nyanpasu.exe")); + let mainEntryPath = path.join(releaseDir, "Clash Nyanpasu.exe"); + if (!(await fs.pathExists(mainEntryPath))) { + mainEntryPath = path.join(releaseDir, "clash-nyanpasu.exe"); + } + zip.addLocalFile(mainEntryPath); zip.addLocalFile(path.join(releaseDir, "clash.exe")); zip.addLocalFile(path.join(releaseDir, "mihomo.exe")); zip.addLocalFile(path.join(releaseDir, "mihomo-alpha.exe")); diff --git a/clash-nyanpasu/scripts/prepare-nightly.ts b/clash-nyanpasu/scripts/prepare-nightly.ts index 534f9a4546..4499783504 100644 --- a/clash-nyanpasu/scripts/prepare-nightly.ts +++ b/clash-nyanpasu/scripts/prepare-nightly.ts @@ -35,9 +35,7 @@ async function main() { // const wxsFile = await fs.readFile(WXS_PATH, "utf-8"); if (isNSIS) { - tauriConf.tauri.bundle.targets = ["nsis", "updater"]; - } else if (isMSI) { - tauriConf.tauri.bundle.targets = ["msi", "updater"]; + tauriConf.bundle.targets = ["nsis"]; } consola.debug("Get current git short hash"); @@ -46,7 +44,7 @@ async function main() { .trim(); consola.debug(`Current git short hash: ${GIT_SHORT_HASH}`); - const version = `${tauriConf.package.version}-alpha+${GIT_SHORT_HASH}`; + const version = `${tauriConf.version}-alpha+${GIT_SHORT_HASH}`; // blocked by https://github.com/tauri-apps/tauri/issues/8447 // 1. update wxs version // consola.debug("Write raw version to wxs"); @@ -58,7 +56,7 @@ async function main() { // consola.debug("wxs updated"); // 2. update tauri version consola.debug("Write tauri version to tauri.nightly.conf.json"); - if (!isNSIS && !isMSI) tauriConf.package.version = version; + if (!isNSIS && !isMSI) tauriConf.version = version; await fs.writeJSON(TAURI_DEV_APP_CONF_PATH, tauriConf, { spaces: 2 }); consola.debug("tauri.nightly.conf.json updated"); // 3. update package version diff --git a/clash-nyanpasu/scripts/prepare-release.ts b/clash-nyanpasu/scripts/prepare-release.ts index 347cb2d007..b888135354 100644 --- a/clash-nyanpasu/scripts/prepare-release.ts +++ b/clash-nyanpasu/scripts/prepare-release.ts @@ -23,9 +23,9 @@ async function main() { const tauriConf = tauriAppConf; // const wxsFile = await fs.readFile(WXS_PATH, "utf-8"); - if (isNSIS) { - tauriConf.tauri.bundle.targets = ["nsis", "updater"]; - } + // if (isNSIS) { + // tauriConf.tauri.bundle.targets = ["nsis", "updater"]; + // } consola.debug("Write tauri version to tauri.conf.json"); await fs.writeJSON(TAURI_APP_CONF, tauriConf, { spaces: 2 }); diff --git a/clash-nyanpasu/scripts/telegram-notify.ts b/clash-nyanpasu/scripts/telegram-notify.ts index f9b5f73f62..1676d5afe0 100644 --- a/clash-nyanpasu/scripts/telegram-notify.ts +++ b/clash-nyanpasu/scripts/telegram-notify.ts @@ -2,6 +2,7 @@ import { existsSync } from "fs"; import path from "path"; import { mkdirp } from "fs-extra"; +import pRetry from "p-retry"; import { getOctokit } from "@actions/github"; import { version } from "../package.json"; import { array2text } from "./utils"; @@ -52,7 +53,7 @@ const isValidFormat = (fileName: string): boolean => { return resourceFormats.some((format) => fileName.endsWith(format)); }; -const repoinfo = { +const repoInfo = { owner: "LibNyanpasu", repo: "clash-nyanpasu", }; @@ -66,22 +67,26 @@ const repoinfo = { const content = nightlyBuild ? await github.rest.repos.getReleaseByTag({ - ...repoinfo, + ...repoInfo, tag: "pre-release", }) - : await github.rest.repos.getLatestRelease(repoinfo); + : await github.rest.repos.getLatestRelease(repoInfo); const downloadTasks: Promise[] = []; - const reourceMappping: string[] = []; + const resourceMapping: string[] = []; content.data.assets.forEach((asset) => { if (isValidFormat(asset.name)) { const _path = path.join(TEMP_DIR, asset.name); - reourceMappping.push(_path); + resourceMapping.push(_path); - downloadTasks.push(downloadFile(asset.browser_download_url, _path)); + downloadTasks.push( + pRetry(() => downloadFile(asset.browser_download_url, _path), { + retries: 5, + }), + ); } }); @@ -94,19 +99,23 @@ const repoinfo = { throw new Error("Error during download or upload tasks"); } - reourceMappping.forEach((item) => { + resourceMapping.forEach((item) => { consola.log(`exited ${item}:`, existsSync(item)); }); consola.start("Staring upload tasks (nightly)"); - await client.sendFile(TELEGRAM_TO_NIGHTLY, { - file: reourceMappping, - forceDocument: true, - caption: `Clash Nyanpasu Nightly Build ${GIT_SHORT_HASH}`, - workers: 16, - progressCallback: (progress) => consola.start(`Uploading ${progress}`), - }); + await pRetry( + () => + client.sendFile(TELEGRAM_TO_NIGHTLY, { + file: resourceMapping, + forceDocument: true, + caption: `Clash Nyanpasu Nightly Build ${GIT_SHORT_HASH}`, + workers: 16, + progressCallback: (progress) => consola.debug(`Uploading ${progress}`), + }), + { retries: 5 }, + ); consola.success("Upload finished (nightly)"); @@ -128,4 +137,7 @@ const repoinfo = { await client.disconnect(); process.exit(); -})(); +})().catch((error) => { + consola.fatal(error); + process.exit(1); +}); diff --git a/clash-nyanpasu/scripts/updater-nightly.ts b/clash-nyanpasu/scripts/updater-nightly.ts index 2c1631606d..b3d1f8d1d5 100644 --- a/clash-nyanpasu/scripts/updater-nightly.ts +++ b/clash-nyanpasu/scripts/updater-nightly.ts @@ -35,7 +35,7 @@ async function resolveUpdater() { .replace("\r", ""); consola.info(`latest pre-release short hash: ${shortHash}`); const updateData = { - name: `v${tauriNightly.package.version}-alpha+${shortHash}`, + name: `v${tauriNightly.version}-alpha+${shortHash}`, notes: "Nightly build. Full changes see commit history.", pub_date: new Date().toISOString(), platforms: { @@ -199,4 +199,5 @@ async function getSignature(url: string) { resolveUpdater().catch((err) => { consola.fatal(err); + process.exit(1); }); diff --git a/clash-nyanpasu/scripts/utils/download.ts b/clash-nyanpasu/scripts/utils/download.ts index bd16d27000..30b4c87487 100644 --- a/clash-nyanpasu/scripts/utils/download.ts +++ b/clash-nyanpasu/scripts/utils/download.ts @@ -25,7 +25,11 @@ export const downloadFile = async (url: string, path: string) => { const response = await fetch(url, { ...options, method: "GET", - headers: { "Content-Type": "application/octet-stream" }, + headers: { + "Content-Type": "application/octet-stream", + "User-Agent": + "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:131.0) Gecko/20100101 Firefox/131.0", + }, }); const buffer = await response.arrayBuffer(); diff --git a/clash-nyanpasu/scripts/utils/resolve.ts b/clash-nyanpasu/scripts/utils/resolve.ts index 0f4448d035..f9eacb87e1 100644 --- a/clash-nyanpasu/scripts/utils/resolve.ts +++ b/clash-nyanpasu/scripts/utils/resolve.ts @@ -1,3 +1,4 @@ +import crypto from "node:crypto"; import path from "path"; import AdmZip from "adm-zip"; import fs from "fs-extra"; @@ -63,16 +64,35 @@ export class Resolve { */ public async wintun() { const { platform } = process; - + let arch = this.options.arch || "x64"; if (platform !== "win32") return; + switch (arch) { + case "x64": + arch = "amd64"; + break; + case "ia32": + arch = "x86"; + break; + case "arm": + arch = "arm"; + break; + case "arm64": + arch = "arm64"; + break; + default: + throw new Error(`unsupported arch ${arch}`); + } + const url = "https://www.wintun.net/builds/wintun-0.14.1.zip"; + const hash = + "07c256185d6ee3652e09fa55c0b673e2624b565e02c4b9091c79ca7d2f24ef51"; const tempDir = path.join(TEMP_DIR, "wintun"); const tempZip = path.join(tempDir, "wintun.zip"); - const wintunPath = path.join(tempDir, "wintun/bin/amd64/wintun.dll"); + // const wintunPath = path.join(tempDir, "wintun/bin/amd64/wintun.dll"); const targetPath = path.join(TAURI_APP_DIR, "resources", "wintun.dll"); @@ -84,16 +104,39 @@ export class Resolve { await downloadFile(url, tempZip); } + // check hash + const hashBuffer = await fs.readFile(tempZip); + const sha256 = crypto.createHash("sha256"); + sha256.update(hashBuffer); + const hashValue = sha256.digest("hex"); + if (hashValue !== hash) { + throw new Error(`wintun. hash not match ${hashValue}`); + } + // unzip const zip = new AdmZip(tempZip); zip.extractAllTo(tempDir, true); + // recursive list path for debug use + const files = (await fs.readdir(tempDir, { recursive: true })).filter( + (file) => file.includes("wintun.dll"), + ); + consola.debug(colorize`{green wintun} founded dlls: ${files}`); + + const file = files.find((file) => file.includes(arch)); + if (!file) { + throw new Error(`wintun. not found arch ${arch}`); + } + + const wintunPath = path.join(tempDir, file.toString()); + if (!(await fs.pathExists(wintunPath))) { throw new Error(`path not found "${wintunPath}"`); } - - await fs.rename(wintunPath, targetPath); + // prepare resource dir + await fs.mkdirp(path.dirname(targetPath)); + await fs.copyFile(wintunPath, targetPath); await fs.remove(tempDir); diff --git a/echo/go.mod b/echo/go.mod index 2ff9d23c94..23f0089188 100644 --- a/echo/go.mod +++ b/echo/go.mod @@ -27,7 +27,6 @@ require ( golang.org/x/sync v0.8.0 golang.org/x/time v0.6.0 google.golang.org/grpc v1.65.0 - gopkg.in/yaml.v3 v3.0.1 modernc.org/sqlite v1.32.0 ) @@ -130,6 +129,7 @@ require ( google.golang.org/genproto/googleapis/rpc v0.0.0-20240528184218-531527333157 // indirect google.golang.org/protobuf v1.34.2 // indirect gopkg.in/yaml.v2 v2.4.0 // indirect + gopkg.in/yaml.v3 v3.0.1 // indirect gvisor.dev/gvisor v0.0.0-20231202080848-1f7806d17489 // indirect howett.net/plist v1.0.1 // indirect lukechampine.com/blake3 v1.3.0 // indirect diff --git a/echo/hack/get-ehco.sh b/echo/hack/get-ehco.sh index c96dc058d5..61c71fbc7c 100755 --- a/echo/hack/get-ehco.sh +++ b/echo/hack/get-ehco.sh @@ -61,21 +61,46 @@ WantedBy=multi-user.target EOF } +function _detect_package_manager() { + if command -v apt-get &>/dev/null; then + echo "apt-get" + elif command -v yum &>/dev/null; then + echo "yum" + elif command -v dnf &>/dev/null; then + echo "dnf" + else + echo "未知" + fi +} + +function _install_dependencies() { + local pkg_manager=$(_detect_package_manager) + + case $pkg_manager in + apt-get) + sudo apt-get update + sudo apt-get install -y jq curl + ;; + yum|dnf) + sudo $pkg_manager install -y jq curl + ;; + *) + _print_error_msg "无法检测到支持的包管理器。请手动安装 jq 和 curl。" + exit 1 + ;; + esac +} + function _check_install_required() { if [[ -z "$API_OR_CONFIG_PATH" ]]; then - _print_error_msg "Flag for config is required. please use --config to specify the configuration file path or api endpoint." + _print_error_msg "需要配置标志。请使用 --config 指定配置文件路径或 API 端点。" exit 1 fi - # check jq and curl - if ! command -v jq &>/dev/null; then - _print_error_msg "jq is required to parse JSON data. please use apt/yum to install jq." - exit 1 - fi - - if ! command -v curl &>/dev/null; then - _print_error_msg "curl is required to download files. please use apt/yum to install curl." - exit 1 + # 检查并安装 jq 和 curl + if ! command -v jq &>/dev/null || ! command -v curl &>/dev/null; then + _print_warning_msg "正在安装必要的依赖项 (jq 和 curl)..." + _install_dependencies fi } @@ -248,7 +273,7 @@ function perform_install() { _download_bin _install_systemd_service - _print_warning_msg "Ehco has been installed." + _print_warning_msg "Ehco 已安装完成。" } function perform_remove() { diff --git a/echo/internal/constant/constant.go b/echo/internal/constant/constant.go index 917113eafa..7f62c39fd3 100644 --- a/echo/internal/constant/constant.go +++ b/echo/internal/constant/constant.go @@ -5,7 +5,7 @@ import "time" type RelayType string var ( - Version = "1.1.5-dev" + Version = "1.1.5" GitBranch string GitRevision string BuildTime string diff --git a/echo/internal/web/templates/_navbar.html b/echo/internal/web/templates/_navbar.html index 4aa2aa5738..693edbfef0 100644 --- a/echo/internal/web/templates/_navbar.html +++ b/echo/internal/web/templates/_navbar.html @@ -20,7 +20,7 @@ - Metrics + Monitor diff --git a/echo/internal/web/templates/index.html b/echo/internal/web/templates/index.html index 31c71f73a5..dd593f23cd 100644 --- a/echo/internal/web/templates/index.html +++ b/echo/internal/web/templates/index.html @@ -21,11 +21,19 @@
  • StartTime: {{.StartTime}}
  • +
    +

    Latest Version: Checking...

    + +
    +
    @@ -46,7 +54,20 @@ diff --git a/echo/pkg/metric_reader/node.go b/echo/pkg/metric_reader/node.go index 4730bbd548..4a4e0d7b61 100644 --- a/echo/pkg/metric_reader/node.go +++ b/echo/pkg/metric_reader/node.go @@ -66,7 +66,6 @@ func (b *readerImpl) ParseNodeMetrics(metricMap map[string]*dto.MetricFamily, nm b.processLoadMetrics(metricMap, nm) b.calculateFinalMetrics(nm, cpu) - return nil } @@ -95,9 +94,24 @@ func (b *readerImpl) processMemoryMetrics(metricMap map[string]*dto.MetricFamily } func (b *readerImpl) processDiskMetrics(metricMap map[string]*dto.MetricFamily, nm *NodeMetrics) { - nm.DiskTotalBytes = sumInt64Metric(metricMap, metricFilesystemSizeBytes) - availableDisk := sumInt64Metric(metricMap, metricFilesystemAvailBytes) - nm.DiskUsageBytes = nm.DiskTotalBytes - availableDisk + if metric, ok := metricMap[metricFilesystemSizeBytes]; ok { + for _, m := range metric.Metric { + if getLabel(m, "mountpoint") == "/" { + nm.DiskTotalBytes = int64(getMetricValue(m, metric.GetType())) + break + } + } + } + + if metric, ok := metricMap[metricFilesystemAvailBytes]; ok { + for _, m := range metric.Metric { + if getLabel(m, "mountpoint") == "/" { + availableDisk := int64(getMetricValue(m, metric.GetType())) + nm.DiskUsageBytes = nm.DiskTotalBytes - availableDisk + break + } + } + } } func (b *readerImpl) processNetworkMetrics(metricMap map[string]*dto.MetricFamily, nm *NodeMetrics) { diff --git a/mihomo/adapter/provider/provider.go b/mihomo/adapter/provider/provider.go index a99c1d9680..107b621b41 100644 --- a/mihomo/adapter/provider/provider.go +++ b/mihomo/adapter/provider/provider.go @@ -98,6 +98,10 @@ func (pp *proxySetProvider) Proxies() []C.Proxy { return pp.proxies } +func (pp *proxySetProvider) Count() int { + return len(pp.proxies) +} + func (pp *proxySetProvider) Touch() { pp.healthCheck.touch() } @@ -126,7 +130,7 @@ func (pp *proxySetProvider) getSubscriptionInfo() { ctx, cancel := context.WithTimeout(context.Background(), time.Second*90) defer cancel() resp, err := mihomoHttp.HttpRequestWithProxy(ctx, pp.Vehicle().(*resource.HTTPVehicle).Url(), - http.MethodGet, http.Header{"User-Agent": {C.UA}}, nil, pp.Vehicle().Proxy()) + http.MethodGet, nil, nil, pp.Vehicle().Proxy()) if err != nil { return } @@ -267,6 +271,10 @@ func (cp *compatibleProvider) Proxies() []C.Proxy { return cp.proxies } +func (cp *compatibleProvider) Count() int { + return len(cp.proxies) +} + func (cp *compatibleProvider) Touch() { cp.healthCheck.touch() } diff --git a/mihomo/component/dialer/dialer.go b/mihomo/component/dialer/dialer.go index 2a39508f3f..41f79b8e52 100644 --- a/mihomo/component/dialer/dialer.go +++ b/mihomo/component/dialer/dialer.go @@ -84,7 +84,7 @@ func ListenPacket(ctx context.Context, network, address string, rAddrPort netip. if cfg.addrReuse { addrReuseToListenConfig(lc) } - if DefaultSocketHook != nil { // ignore interfaceName, routingMark when DefaultSocketHook not null (in CFMA) + if DefaultSocketHook != nil { // ignore interfaceName, routingMark when DefaultSocketHook not null (in CMFA) socketHookToListenConfig(lc) } else { if cfg.interfaceName != "" { @@ -148,7 +148,7 @@ func dialContext(ctx context.Context, network string, destination netip.Addr, po setMultiPathTCP(dialer) } - if DefaultSocketHook != nil { // ignore interfaceName, routingMark and tfo when DefaultSocketHook not null (in CFMA) + if DefaultSocketHook != nil { // ignore interfaceName, routingMark and tfo when DefaultSocketHook not null (in CMFA) socketHookToToDialer(dialer) } else { if opt.interfaceName != "" { diff --git a/mihomo/component/dialer/socket_hook.go b/mihomo/component/dialer/socket_hook.go index 7a2ea43215..f860552579 100644 --- a/mihomo/component/dialer/socket_hook.go +++ b/mihomo/component/dialer/socket_hook.go @@ -7,11 +7,11 @@ import ( ) // SocketControl -// never change type traits because it's used in CFMA +// never change type traits because it's used in CMFA type SocketControl func(network, address string, conn syscall.RawConn) error // DefaultSocketHook -// never change type traits because it's used in CFMA +// never change type traits because it's used in CMFA var DefaultSocketHook SocketControl func socketHookToToDialer(dialer *net.Dialer) { diff --git a/mihomo/component/fakeip/pool_test.go b/mihomo/component/fakeip/pool_test.go index 923cca574d..ee607b68b4 100644 --- a/mihomo/component/fakeip/pool_test.go +++ b/mihomo/component/fakeip/pool_test.go @@ -63,13 +63,13 @@ func TestPool_Basic(t *testing.T) { last := pool.Lookup("bar.com") bar, exist := pool.LookBack(last) - assert.True(t, first == netip.AddrFrom4([4]byte{192, 168, 0, 4})) - assert.True(t, pool.Lookup("foo.com") == netip.AddrFrom4([4]byte{192, 168, 0, 4})) - assert.True(t, last == netip.AddrFrom4([4]byte{192, 168, 0, 5})) + assert.Equal(t, first, netip.AddrFrom4([4]byte{192, 168, 0, 4})) + assert.Equal(t, pool.Lookup("foo.com"), netip.AddrFrom4([4]byte{192, 168, 0, 4})) + assert.Equal(t, last, netip.AddrFrom4([4]byte{192, 168, 0, 5})) assert.True(t, exist) assert.Equal(t, bar, "bar.com") - assert.True(t, pool.Gateway() == netip.AddrFrom4([4]byte{192, 168, 0, 1})) - assert.True(t, pool.Broadcast() == netip.AddrFrom4([4]byte{192, 168, 0, 15})) + assert.Equal(t, pool.Gateway(), netip.AddrFrom4([4]byte{192, 168, 0, 1})) + assert.Equal(t, pool.Broadcast(), netip.AddrFrom4([4]byte{192, 168, 0, 15})) assert.Equal(t, pool.IPNet().String(), ipnet.String()) assert.True(t, pool.Exist(netip.AddrFrom4([4]byte{192, 168, 0, 5}))) assert.False(t, pool.Exist(netip.AddrFrom4([4]byte{192, 168, 0, 6}))) @@ -91,13 +91,13 @@ func TestPool_BasicV6(t *testing.T) { last := pool.Lookup("bar.com") bar, exist := pool.LookBack(last) - assert.True(t, first == netip.MustParseAddr("2001:4860:4860:0000:0000:0000:0000:8804")) - assert.True(t, pool.Lookup("foo.com") == netip.MustParseAddr("2001:4860:4860:0000:0000:0000:0000:8804")) - assert.True(t, last == netip.MustParseAddr("2001:4860:4860:0000:0000:0000:0000:8805")) + assert.Equal(t, first, netip.MustParseAddr("2001:4860:4860:0000:0000:0000:0000:8804")) + assert.Equal(t, pool.Lookup("foo.com"), netip.MustParseAddr("2001:4860:4860:0000:0000:0000:0000:8804")) + assert.Equal(t, last, netip.MustParseAddr("2001:4860:4860:0000:0000:0000:0000:8805")) assert.True(t, exist) assert.Equal(t, bar, "bar.com") - assert.True(t, pool.Gateway() == netip.MustParseAddr("2001:4860:4860:0000:0000:0000:0000:8801")) - assert.True(t, pool.Broadcast() == netip.MustParseAddr("2001:4860:4860:0000:0000:0000:0000:8bff")) + assert.Equal(t, pool.Gateway(), netip.MustParseAddr("2001:4860:4860:0000:0000:0000:0000:8801")) + assert.Equal(t, pool.Broadcast(), netip.MustParseAddr("2001:4860:4860:0000:0000:0000:0000:8bff")) assert.Equal(t, pool.IPNet().String(), ipnet.String()) assert.True(t, pool.Exist(netip.MustParseAddr("2001:4860:4860:0000:0000:0000:0000:8805"))) assert.False(t, pool.Exist(netip.MustParseAddr("2001:4860:4860:0000:0000:0000:0000:8806"))) @@ -143,8 +143,8 @@ func TestPool_CycleUsed(t *testing.T) { } baz := pool.Lookup("baz.com") next := pool.Lookup("foo.com") - assert.True(t, foo == baz) - assert.True(t, next == bar) + assert.Equal(t, foo, baz) + assert.Equal(t, next, bar) } } @@ -201,7 +201,7 @@ func TestPool_MaxCacheSize(t *testing.T) { pool.Lookup("baz.com") next := pool.Lookup("foo.com") - assert.False(t, first == next) + assert.NotEqual(t, first, next) } func TestPool_DoubleMapping(t *testing.T) { @@ -231,7 +231,7 @@ func TestPool_DoubleMapping(t *testing.T) { assert.False(t, bazExist) assert.True(t, barExist) - assert.False(t, bazIP == newBazIP) + assert.NotEqual(t, bazIP, newBazIP) } func TestPool_Clone(t *testing.T) { @@ -243,8 +243,8 @@ func TestPool_Clone(t *testing.T) { first := pool.Lookup("foo.com") last := pool.Lookup("bar.com") - assert.True(t, first == netip.AddrFrom4([4]byte{192, 168, 0, 4})) - assert.True(t, last == netip.AddrFrom4([4]byte{192, 168, 0, 5})) + assert.Equal(t, first, netip.AddrFrom4([4]byte{192, 168, 0, 4})) + assert.Equal(t, last, netip.AddrFrom4([4]byte{192, 168, 0, 5})) newPool, _ := New(Options{ IPNet: ipnet, @@ -289,13 +289,13 @@ func TestPool_FlushFileCache(t *testing.T) { baz := pool.Lookup("foo.com") nero := pool.Lookup("foo.com") - assert.True(t, foo == fox) - assert.True(t, foo == next) - assert.False(t, foo == baz) - assert.True(t, bar == bax) - assert.True(t, bar == baz) - assert.False(t, bar == next) - assert.True(t, baz == nero) + assert.Equal(t, foo, fox) + assert.Equal(t, foo, next) + assert.NotEqual(t, foo, baz) + assert.Equal(t, bar, bax) + assert.Equal(t, bar, baz) + assert.NotEqual(t, bar, next) + assert.Equal(t, baz, nero) } } @@ -318,11 +318,11 @@ func TestPool_FlushMemoryCache(t *testing.T) { baz := pool.Lookup("foo.com") nero := pool.Lookup("foo.com") - assert.True(t, foo == fox) - assert.True(t, foo == next) - assert.False(t, foo == baz) - assert.True(t, bar == bax) - assert.True(t, bar == baz) - assert.False(t, bar == next) - assert.True(t, baz == nero) + assert.Equal(t, foo, fox) + assert.Equal(t, foo, next) + assert.NotEqual(t, foo, baz) + assert.Equal(t, bar, bax) + assert.Equal(t, bar, baz) + assert.NotEqual(t, bar, next) + assert.Equal(t, baz, nero) } diff --git a/mihomo/component/geodata/init.go b/mihomo/component/geodata/init.go index 834567a447..08ec1b948d 100644 --- a/mihomo/component/geodata/init.go +++ b/mihomo/component/geodata/init.go @@ -6,8 +6,10 @@ import ( "io" "net/http" "os" + "sync" "time" + "github.com/metacubex/mihomo/common/atomic" mihomoHttp "github.com/metacubex/mihomo/component/http" "github.com/metacubex/mihomo/component/mmdb" C "github.com/metacubex/mihomo/constant" @@ -18,12 +20,79 @@ var ( initGeoSite bool initGeoIP int initASN bool + + initGeoSiteMutex sync.Mutex + initGeoIPMutex sync.Mutex + initASNMutex sync.Mutex + + geoIpEnable atomic.Bool + geoSiteEnable atomic.Bool + asnEnable atomic.Bool + + geoIpUrl string + mmdbUrl string + geoSiteUrl string + asnUrl string ) +func GeoIpUrl() string { + return geoIpUrl +} + +func SetGeoIpUrl(url string) { + geoIpUrl = url +} + +func MmdbUrl() string { + return mmdbUrl +} + +func SetMmdbUrl(url string) { + mmdbUrl = url +} + +func GeoSiteUrl() string { + return geoSiteUrl +} + +func SetGeoSiteUrl(url string) { + geoSiteUrl = url +} + +func ASNUrl() string { + return asnUrl +} + +func SetASNUrl(url string) { + asnUrl = url +} + +func downloadToPath(url string, path string) (err error) { + ctx, cancel := context.WithTimeout(context.Background(), time.Second*90) + defer cancel() + resp, err := mihomoHttp.HttpRequest(ctx, url, http.MethodGet, nil, nil) + if err != nil { + return + } + defer resp.Body.Close() + + f, err := os.OpenFile(path, os.O_CREATE|os.O_WRONLY, 0o644) + if err != nil { + return err + } + defer f.Close() + _, err = io.Copy(f, resp.Body) + + return err +} + func InitGeoSite() error { + geoSiteEnable.Store(true) + initGeoSiteMutex.Lock() + defer initGeoSiteMutex.Unlock() if _, err := os.Stat(C.Path.GeoSite()); os.IsNotExist(err) { log.Infoln("Can't find GeoSite.dat, start download") - if err := downloadGeoSite(C.Path.GeoSite()); err != nil { + if err := downloadToPath(GeoSiteUrl(), C.Path.GeoSite()); err != nil { return fmt.Errorf("can't download GeoSite.dat: %s", err.Error()) } log.Infoln("Download GeoSite.dat finish") @@ -35,7 +104,7 @@ func InitGeoSite() error { if err := os.Remove(C.Path.GeoSite()); err != nil { return fmt.Errorf("can't remove invalid GeoSite.dat: %s", err.Error()) } - if err := downloadGeoSite(C.Path.GeoSite()); err != nil { + if err := downloadToPath(GeoSiteUrl(), C.Path.GeoSite()); err != nil { return fmt.Errorf("can't download GeoSite.dat: %s", err.Error()) } } @@ -44,49 +113,14 @@ func InitGeoSite() error { return nil } -func downloadGeoSite(path string) (err error) { - ctx, cancel := context.WithTimeout(context.Background(), time.Second*90) - defer cancel() - resp, err := mihomoHttp.HttpRequest(ctx, C.GeoSiteUrl, http.MethodGet, http.Header{"User-Agent": {C.UA}}, nil) - if err != nil { - return - } - defer resp.Body.Close() - - f, err := os.OpenFile(path, os.O_CREATE|os.O_WRONLY, 0o644) - if err != nil { - return err - } - defer f.Close() - _, err = io.Copy(f, resp.Body) - - return err -} - -func downloadGeoIP(path string) (err error) { - ctx, cancel := context.WithTimeout(context.Background(), time.Second*90) - defer cancel() - resp, err := mihomoHttp.HttpRequest(ctx, C.GeoIpUrl, http.MethodGet, http.Header{"User-Agent": {C.UA}}, nil) - if err != nil { - return - } - defer resp.Body.Close() - - f, err := os.OpenFile(path, os.O_CREATE|os.O_WRONLY, 0o644) - if err != nil { - return err - } - defer f.Close() - _, err = io.Copy(f, resp.Body) - - return err -} - func InitGeoIP() error { - if C.GeodataMode { + geoIpEnable.Store(true) + initGeoIPMutex.Lock() + defer initGeoIPMutex.Unlock() + if GeodataMode() { if _, err := os.Stat(C.Path.GeoIP()); os.IsNotExist(err) { log.Infoln("Can't find GeoIP.dat, start download") - if err := downloadGeoIP(C.Path.GeoIP()); err != nil { + if err := downloadToPath(GeoIpUrl(), C.Path.GeoIP()); err != nil { return fmt.Errorf("can't download GeoIP.dat: %s", err.Error()) } log.Infoln("Download GeoIP.dat finish") @@ -99,7 +133,7 @@ func InitGeoIP() error { if err := os.Remove(C.Path.GeoIP()); err != nil { return fmt.Errorf("can't remove invalid GeoIP.dat: %s", err.Error()) } - if err := downloadGeoIP(C.Path.GeoIP()); err != nil { + if err := downloadToPath(GeoIpUrl(), C.Path.GeoIP()); err != nil { return fmt.Errorf("can't download GeoIP.dat: %s", err.Error()) } } @@ -110,7 +144,7 @@ func InitGeoIP() error { if _, err := os.Stat(C.Path.MMDB()); os.IsNotExist(err) { log.Infoln("Can't find MMDB, start download") - if err := mmdb.DownloadMMDB(C.Path.MMDB()); err != nil { + if err := downloadToPath(MmdbUrl(), C.Path.MMDB()); err != nil { return fmt.Errorf("can't download MMDB: %s", err.Error()) } } @@ -121,7 +155,7 @@ func InitGeoIP() error { if err := os.Remove(C.Path.MMDB()); err != nil { return fmt.Errorf("can't remove invalid MMDB: %s", err.Error()) } - if err := mmdb.DownloadMMDB(C.Path.MMDB()); err != nil { + if err := downloadToPath(MmdbUrl(), C.Path.MMDB()); err != nil { return fmt.Errorf("can't download MMDB: %s", err.Error()) } } @@ -131,9 +165,12 @@ func InitGeoIP() error { } func InitASN() error { + asnEnable.Store(true) + initASNMutex.Lock() + defer initASNMutex.Unlock() if _, err := os.Stat(C.Path.ASN()); os.IsNotExist(err) { log.Infoln("Can't find ASN.mmdb, start download") - if err := mmdb.DownloadASN(C.Path.ASN()); err != nil { + if err := downloadToPath(ASNUrl(), C.Path.ASN()); err != nil { return fmt.Errorf("can't download ASN.mmdb: %s", err.Error()) } log.Infoln("Download ASN.mmdb finish") @@ -145,7 +182,7 @@ func InitASN() error { if err := os.Remove(C.Path.ASN()); err != nil { return fmt.Errorf("can't remove invalid ASN: %s", err.Error()) } - if err := mmdb.DownloadASN(C.Path.ASN()); err != nil { + if err := downloadToPath(ASNUrl(), C.Path.ASN()); err != nil { return fmt.Errorf("can't download ASN: %s", err.Error()) } } @@ -153,3 +190,15 @@ func InitASN() error { } return nil } + +func GeoIpEnable() bool { + return geoIpEnable.Load() +} + +func GeoSiteEnable() bool { + return geoSiteEnable.Load() +} + +func ASNEnable() bool { + return asnEnable.Load() +} diff --git a/mihomo/component/geodata/utils.go b/mihomo/component/geodata/utils.go index a16e255e14..4796624966 100644 --- a/mihomo/component/geodata/utils.go +++ b/mihomo/component/geodata/utils.go @@ -13,8 +13,6 @@ import ( var ( geoMode bool - AutoUpdate bool - UpdateInterval int geoLoaderName = "memconservative" geoSiteMatcher = "succinct" ) @@ -25,14 +23,6 @@ func GeodataMode() bool { return geoMode } -func GeoAutoUpdate() bool { - return AutoUpdate -} - -func GeoUpdateInterval() int { - return UpdateInterval -} - func LoaderName() string { return geoLoaderName } @@ -44,12 +34,6 @@ func SiteMatcherName() string { func SetGeodataMode(newGeodataMode bool) { geoMode = newGeodataMode } -func SetGeoAutoUpdate(newAutoUpdate bool) { - AutoUpdate = newAutoUpdate -} -func SetGeoUpdateInterval(newGeoUpdateInterval int) { - UpdateInterval = newGeoUpdateInterval -} func SetLoader(newLoader string) { if newLoader == "memc" { @@ -209,8 +193,11 @@ func LoadGeoIPMatcher(country string) (router.IPMatcher, error) { return matcher, nil } -func ClearCache() { +func ClearGeoSiteCache() { loadGeoSiteMatcherListSF.Reset() loadGeoSiteMatcherSF.Reset() +} + +func ClearGeoIPCache() { loadGeoIPMatcherSF.Reset() } diff --git a/mihomo/component/http/http.go b/mihomo/component/http/http.go index 21d65d2e96..3fc06da3cb 100644 --- a/mihomo/component/http/http.go +++ b/mihomo/component/http/http.go @@ -12,10 +12,21 @@ import ( "time" "github.com/metacubex/mihomo/component/ca" - C "github.com/metacubex/mihomo/constant" "github.com/metacubex/mihomo/listener/inner" ) +var ( + ua string +) + +func UA() string { + return ua +} + +func SetUA(UA string) { + ua = UA +} + func HttpRequest(ctx context.Context, url, method string, header map[string][]string, body io.Reader) (*http.Response, error) { return HttpRequestWithProxy(ctx, url, method, header, body, "") } @@ -35,7 +46,7 @@ func HttpRequestWithProxy(ctx context.Context, url, method string, header map[st } if _, ok := header["User-Agent"]; !ok { - req.Header.Set("User-Agent", C.UA) + req.Header.Set("User-Agent", UA()) } if err != nil { diff --git a/mihomo/component/mmdb/mmdb.go b/mihomo/component/mmdb/mmdb.go index 81156bc62d..81644b0076 100644 --- a/mihomo/component/mmdb/mmdb.go +++ b/mihomo/component/mmdb/mmdb.go @@ -1,15 +1,9 @@ package mmdb import ( - "context" - "io" - "net/http" - "os" "sync" - "time" mihomoOnce "github.com/metacubex/mihomo/common/once" - mihomoHttp "github.com/metacubex/mihomo/component/http" C "github.com/metacubex/mihomo/constant" "github.com/metacubex/mihomo/log" @@ -25,26 +19,26 @@ const ( ) var ( - IPreader IPReader - ASNreader ASNReader - IPonce sync.Once - ASNonce sync.Once + ipReader IPReader + asnReader ASNReader + ipOnce sync.Once + asnOnce sync.Once ) func LoadFromBytes(buffer []byte) { - IPonce.Do(func() { + ipOnce.Do(func() { mmdb, err := maxminddb.FromBytes(buffer) if err != nil { log.Fatalln("Can't load mmdb: %s", err.Error()) } - IPreader = IPReader{Reader: mmdb} + ipReader = IPReader{Reader: mmdb} switch mmdb.Metadata.DatabaseType { case "sing-geoip": - IPreader.databaseType = typeSing + ipReader.databaseType = typeSing case "Meta-geoip0": - IPreader.databaseType = typeMetaV0 + ipReader.databaseType = typeMetaV0 default: - IPreader.databaseType = typeMaxmind + ipReader.databaseType = typeMaxmind } }) } @@ -58,83 +52,45 @@ func Verify(path string) bool { } func IPInstance() IPReader { - IPonce.Do(func() { + ipOnce.Do(func() { mmdbPath := C.Path.MMDB() log.Infoln("Load MMDB file: %s", mmdbPath) mmdb, err := maxminddb.Open(mmdbPath) if err != nil { log.Fatalln("Can't load MMDB: %s", err.Error()) } - IPreader = IPReader{Reader: mmdb} + ipReader = IPReader{Reader: mmdb} switch mmdb.Metadata.DatabaseType { case "sing-geoip": - IPreader.databaseType = typeSing + ipReader.databaseType = typeSing case "Meta-geoip0": - IPreader.databaseType = typeMetaV0 + ipReader.databaseType = typeMetaV0 default: - IPreader.databaseType = typeMaxmind + ipReader.databaseType = typeMaxmind } }) - return IPreader -} - -func DownloadMMDB(path string) (err error) { - ctx, cancel := context.WithTimeout(context.Background(), time.Second*90) - defer cancel() - resp, err := mihomoHttp.HttpRequest(ctx, C.MmdbUrl, http.MethodGet, http.Header{"User-Agent": {C.UA}}, nil) - if err != nil { - return - } - defer resp.Body.Close() - - f, err := os.OpenFile(path, os.O_CREATE|os.O_WRONLY, 0o644) - if err != nil { - return err - } - defer f.Close() - _, err = io.Copy(f, resp.Body) - - return err + return ipReader } func ASNInstance() ASNReader { - ASNonce.Do(func() { + asnOnce.Do(func() { ASNPath := C.Path.ASN() log.Infoln("Load ASN file: %s", ASNPath) asn, err := maxminddb.Open(ASNPath) if err != nil { log.Fatalln("Can't load ASN: %s", err.Error()) } - ASNreader = ASNReader{Reader: asn} + asnReader = ASNReader{Reader: asn} }) - return ASNreader -} - -func DownloadASN(path string) (err error) { - ctx, cancel := context.WithTimeout(context.Background(), time.Second*90) - defer cancel() - resp, err := mihomoHttp.HttpRequest(ctx, C.ASNUrl, http.MethodGet, http.Header{"User-Agent": {C.UA}}, nil) - if err != nil { - return - } - defer resp.Body.Close() - - f, err := os.OpenFile(path, os.O_CREATE|os.O_WRONLY, 0o644) - if err != nil { - return err - } - defer f.Close() - _, err = io.Copy(f, resp.Body) - - return err + return asnReader } func ReloadIP() { - mihomoOnce.Reset(&IPonce) + mihomoOnce.Reset(&ipOnce) } func ReloadASN() { - mihomoOnce.Reset(&ASNonce) + mihomoOnce.Reset(&asnOnce) } diff --git a/mihomo/component/mmdb/patch_android.go b/mihomo/component/mmdb/patch_android.go index 147a332434..dfa96cacbd 100644 --- a/mihomo/component/mmdb/patch_android.go +++ b/mihomo/component/mmdb/patch_android.go @@ -8,11 +8,11 @@ func InstallOverride(override *maxminddb.Reader) { newReader := IPReader{Reader: override} switch override.Metadata.DatabaseType { case "sing-geoip": - IPreader.databaseType = typeSing + ipReader.databaseType = typeSing case "Meta-geoip0": - IPreader.databaseType = typeMetaV0 + ipReader.databaseType = typeMetaV0 default: - IPreader.databaseType = typeMaxmind + ipReader.databaseType = typeMaxmind } - IPreader = newReader + ipReader = newReader } diff --git a/mihomo/component/process/process.go b/mihomo/component/process/process.go index 84020c4d38..464f5a79bc 100644 --- a/mihomo/component/process/process.go +++ b/mihomo/component/process/process.go @@ -23,11 +23,11 @@ func FindProcessName(network string, srcIP netip.Addr, srcPort int) (uint32, str } // PackageNameResolver -// never change type traits because it's used in CFMA +// never change type traits because it's used in CMFA type PackageNameResolver func(metadata *C.Metadata) (string, error) // DefaultPackageNameResolver -// never change type traits because it's used in CFMA +// never change type traits because it's used in CMFA var DefaultPackageNameResolver PackageNameResolver func FindPackageName(metadata *C.Metadata) (string, error) { diff --git a/mihomo/component/updater/update_core.go b/mihomo/component/updater/update_core.go index 9f13af9ca5..2aab7833ea 100644 --- a/mihomo/component/updater/update_core.go +++ b/mihomo/component/updater/update_core.go @@ -237,7 +237,7 @@ const MaxPackageFileSize = 32 * 1024 * 1024 func downloadPackageFile() (err error) { ctx, cancel := context.WithTimeout(context.Background(), time.Second*90) defer cancel() - resp, err := mihomoHttp.HttpRequest(ctx, packageURL, http.MethodGet, http.Header{"User-Agent": {C.UA}}, nil) + resp, err := mihomoHttp.HttpRequest(ctx, packageURL, http.MethodGet, nil, nil) if err != nil { return fmt.Errorf("http request failed: %w", err) } @@ -418,7 +418,7 @@ func copyFile(src, dst string) error { func getLatestVersion() (version string, err error) { ctx, cancel := context.WithTimeout(context.Background(), time.Second*5) defer cancel() - resp, err := mihomoHttp.HttpRequest(ctx, versionURL, http.MethodGet, http.Header{"User-Agent": {C.UA}}, nil) + resp, err := mihomoHttp.HttpRequest(ctx, versionURL, http.MethodGet, nil, nil) if err != nil { return "", fmt.Errorf("get Latest Version fail: %w", err) } diff --git a/mihomo/component/updater/update_geo.go b/mihomo/component/updater/update_geo.go index 4d16c12874..6246b1c669 100644 --- a/mihomo/component/updater/update_geo.go +++ b/mihomo/component/updater/update_geo.go @@ -1,6 +1,7 @@ package updater import ( + "context" "errors" "fmt" "os" @@ -8,6 +9,7 @@ import ( "time" "github.com/metacubex/mihomo/common/atomic" + "github.com/metacubex/mihomo/common/batch" "github.com/metacubex/mihomo/component/geodata" _ "github.com/metacubex/mihomo/component/geodata/standard" "github.com/metacubex/mihomo/component/mmdb" @@ -18,69 +20,87 @@ import ( ) var ( - UpdatingGeo atomic.Bool + autoUpdate bool + updateInterval int + + updatingGeo atomic.Bool ) -func updateGeoDatabases() error { - defer runtime.GC() - geoLoader, err := geodata.GetGeoDataLoader("standard") +func GeoAutoUpdate() bool { + return autoUpdate +} + +func GeoUpdateInterval() int { + return updateInterval +} + +func SetGeoAutoUpdate(newAutoUpdate bool) { + autoUpdate = newAutoUpdate +} + +func SetGeoUpdateInterval(newGeoUpdateInterval int) { + updateInterval = newGeoUpdateInterval +} + +func UpdateMMDB() (err error) { + defer mmdb.ReloadIP() + data, err := downloadForBytes(geodata.MmdbUrl()) if err != nil { - return err + return fmt.Errorf("can't download MMDB database file: %w", err) + } + instance, err := maxminddb.FromBytes(data) + if err != nil { + return fmt.Errorf("invalid MMDB database file: %s", err) + } + _ = instance.Close() + + mmdb.IPInstance().Reader.Close() // mmdb is loaded with mmap, so it needs to be closed before overwriting the file + if err = saveFile(data, C.Path.MMDB()); err != nil { + return fmt.Errorf("can't save MMDB database file: %w", err) + } + return nil +} + +func UpdateASN() (err error) { + defer mmdb.ReloadASN() + data, err := downloadForBytes(geodata.ASNUrl()) + if err != nil { + return fmt.Errorf("can't download ASN database file: %w", err) } - if C.GeodataMode { - data, err := downloadForBytes(C.GeoIpUrl) - if err != nil { - return fmt.Errorf("can't download GeoIP database file: %w", err) - } - - if _, err = geoLoader.LoadIPByBytes(data, "cn"); err != nil { - return fmt.Errorf("invalid GeoIP database file: %s", err) - } - - if err = saveFile(data, C.Path.GeoIP()); err != nil { - return fmt.Errorf("can't save GeoIP database file: %w", err) - } - - } else { - defer mmdb.ReloadIP() - data, err := downloadForBytes(C.MmdbUrl) - if err != nil { - return fmt.Errorf("can't download MMDB database file: %w", err) - } - - instance, err := maxminddb.FromBytes(data) - if err != nil { - return fmt.Errorf("invalid MMDB database file: %s", err) - } - _ = instance.Close() - - mmdb.IPInstance().Reader.Close() // mmdb is loaded with mmap, so it needs to be closed before overwriting the file - if err = saveFile(data, C.Path.MMDB()); err != nil { - return fmt.Errorf("can't save MMDB database file: %w", err) - } + instance, err := maxminddb.FromBytes(data) + if err != nil { + return fmt.Errorf("invalid ASN database file: %s", err) } + _ = instance.Close() - if C.ASNEnable { - defer mmdb.ReloadASN() - data, err := downloadForBytes(C.ASNUrl) - if err != nil { - return fmt.Errorf("can't download ASN database file: %w", err) - } - - instance, err := maxminddb.FromBytes(data) - if err != nil { - return fmt.Errorf("invalid ASN database file: %s", err) - } - _ = instance.Close() - - mmdb.ASNInstance().Reader.Close() - if err = saveFile(data, C.Path.ASN()); err != nil { - return fmt.Errorf("can't save ASN database file: %w", err) - } + mmdb.ASNInstance().Reader.Close() // mmdb is loaded with mmap, so it needs to be closed before overwriting the file + if err = saveFile(data, C.Path.ASN()); err != nil { + return fmt.Errorf("can't save ASN database file: %w", err) } + return nil +} - data, err := downloadForBytes(C.GeoSiteUrl) +func UpdateGeoIp() (err error) { + defer geodata.ClearGeoIPCache() + geoLoader, err := geodata.GetGeoDataLoader("standard") + data, err := downloadForBytes(geodata.GeoIpUrl()) + if err != nil { + return fmt.Errorf("can't download GeoIP database file: %w", err) + } + if _, err = geoLoader.LoadIPByBytes(data, "cn"); err != nil { + return fmt.Errorf("invalid GeoIP database file: %s", err) + } + if err = saveFile(data, C.Path.GeoIP()); err != nil { + return fmt.Errorf("can't save GeoIP database file: %w", err) + } + return nil +} + +func UpdateGeoSite() (err error) { + defer geodata.ClearGeoSiteCache() + geoLoader, err := geodata.GetGeoDataLoader("standard") + data, err := downloadForBytes(geodata.GeoSiteUrl()) if err != nil { return fmt.Errorf("can't download GeoSite database file: %w", err) } @@ -92,8 +112,45 @@ func updateGeoDatabases() error { if err = saveFile(data, C.Path.GeoSite()); err != nil { return fmt.Errorf("can't save GeoSite database file: %w", err) } + return nil +} - geodata.ClearCache() +func updateGeoDatabases() error { + defer runtime.GC() + + b, _ := batch.New[interface{}](context.Background()) + + if geodata.GeoIpEnable() { + if geodata.GeodataMode() { + b.Go("UpdateGeoIp", func() (_ interface{}, err error) { + err = UpdateGeoIp() + return + }) + } else { + b.Go("UpdateMMDB", func() (_ interface{}, err error) { + err = UpdateMMDB() + return + }) + } + } + + if geodata.ASNEnable() { + b.Go("UpdateASN", func() (_ interface{}, err error) { + err = UpdateASN() + return + }) + } + + if geodata.GeoSiteEnable() { + b.Go("UpdateGeoSite", func() (_ interface{}, err error) { + err = UpdateGeoSite() + return + }) + } + + if e := b.Wait(); e != nil { + return e.Err + } return nil } @@ -103,12 +160,12 @@ var ErrGetDatabaseUpdateSkip = errors.New("GEO database is updating, skip") func UpdateGeoDatabases() error { log.Infoln("[GEO] Start updating GEO database") - if UpdatingGeo.Load() { + if updatingGeo.Load() { return ErrGetDatabaseUpdateSkip } - UpdatingGeo.Store(true) - defer UpdatingGeo.Store(false) + updatingGeo.Store(true) + defer updatingGeo.Store(false) log.Infoln("[GEO] Updating GEO database") @@ -122,7 +179,7 @@ func UpdateGeoDatabases() error { func getUpdateTime() (err error, time time.Time) { var fileInfo os.FileInfo - if C.GeodataMode { + if geodata.GeodataMode() { fileInfo, err = os.Stat(C.Path.GeoIP()) if err != nil { return err, time @@ -138,13 +195,13 @@ func getUpdateTime() (err error, time time.Time) { } func RegisterGeoUpdater() { - if C.GeoUpdateInterval <= 0 { - log.Errorln("[GEO] Invalid update interval: %d", C.GeoUpdateInterval) + if updateInterval <= 0 { + log.Errorln("[GEO] Invalid update interval: %d", updateInterval) return } go func() { - ticker := time.NewTicker(time.Duration(C.GeoUpdateInterval) * time.Hour) + ticker := time.NewTicker(time.Duration(updateInterval) * time.Hour) defer ticker.Stop() err, lastUpdate := getUpdateTime() @@ -154,8 +211,8 @@ func RegisterGeoUpdater() { } log.Infoln("[GEO] last update time %s", lastUpdate) - if lastUpdate.Add(time.Duration(C.GeoUpdateInterval) * time.Hour).Before(time.Now()) { - log.Infoln("[GEO] Database has not been updated for %v, update now", time.Duration(C.GeoUpdateInterval)*time.Hour) + if lastUpdate.Add(time.Duration(updateInterval) * time.Hour).Before(time.Now()) { + log.Infoln("[GEO] Database has not been updated for %v, update now", time.Duration(updateInterval)*time.Hour) if err := UpdateGeoDatabases(); err != nil { log.Errorln("[GEO] Failed to update GEO database: %s", err.Error()) return @@ -163,7 +220,7 @@ func RegisterGeoUpdater() { } for range ticker.C { - log.Infoln("[GEO] updating database every %d hours", C.GeoUpdateInterval) + log.Infoln("[GEO] updating database every %d hours", updateInterval) if err := UpdateGeoDatabases(); err != nil { log.Errorln("[GEO] Failed to update GEO database: %s", err.Error()) } diff --git a/mihomo/component/updater/utils.go b/mihomo/component/updater/utils.go index 0eecfc6cdc..d9da48c31b 100644 --- a/mihomo/component/updater/utils.go +++ b/mihomo/component/updater/utils.go @@ -9,7 +9,6 @@ import ( "time" mihomoHttp "github.com/metacubex/mihomo/component/http" - C "github.com/metacubex/mihomo/constant" "golang.org/x/exp/constraints" ) @@ -17,7 +16,7 @@ import ( func downloadForBytes(url string) ([]byte, error) { ctx, cancel := context.WithTimeout(context.Background(), time.Second*90) defer cancel() - resp, err := mihomoHttp.HttpRequest(ctx, url, http.MethodGet, http.Header{"User-Agent": {C.UA}}, nil) + resp, err := mihomoHttp.HttpRequest(ctx, url, http.MethodGet, nil, nil) if err != nil { return nil, err } diff --git a/mihomo/config/config.go b/mihomo/config/config.go index 4490ebf6b2..26518758ef 100644 --- a/mihomo/config/config.go +++ b/mihomo/config/config.go @@ -22,6 +22,7 @@ import ( "github.com/metacubex/mihomo/component/cidr" "github.com/metacubex/mihomo/component/fakeip" "github.com/metacubex/mihomo/component/geodata" + mihomoHttp "github.com/metacubex/mihomo/component/http" P "github.com/metacubex/mihomo/component/process" "github.com/metacubex/mihomo/component/resolver" "github.com/metacubex/mihomo/component/sniffer" @@ -433,7 +434,7 @@ func DefaultRawConfig() *RawConfig { Mode: T.Rule, GeoAutoUpdate: false, GeoUpdateInterval: 24, - GeodataMode: C.GeodataMode, + GeodataMode: geodata.GeodataMode(), GeodataLoader: "memconservative", UnifiedDelay: false, Authentication: []string{}, @@ -681,19 +682,16 @@ func ParseRawConfig(rawCfg *RawConfig) (*Config, error) { } func parseGeneral(cfg *RawConfig) (*General, error) { + updater.SetGeoAutoUpdate(cfg.GeoAutoUpdate) + updater.SetGeoUpdateInterval(cfg.GeoUpdateInterval) geodata.SetGeodataMode(cfg.GeodataMode) - geodata.SetGeoAutoUpdate(cfg.GeoAutoUpdate) - geodata.SetGeoUpdateInterval(cfg.GeoUpdateInterval) geodata.SetLoader(cfg.GeodataLoader) geodata.SetSiteMatcher(cfg.GeositeMatcher) - C.GeoAutoUpdate = cfg.GeoAutoUpdate - C.GeoUpdateInterval = cfg.GeoUpdateInterval - C.GeoIpUrl = cfg.GeoXUrl.GeoIp - C.GeoSiteUrl = cfg.GeoXUrl.GeoSite - C.MmdbUrl = cfg.GeoXUrl.Mmdb - C.ASNUrl = cfg.GeoXUrl.ASN - C.GeodataMode = cfg.GeodataMode - C.UA = cfg.GlobalUA + geodata.SetGeoIpUrl(cfg.GeoXUrl.GeoIp) + geodata.SetGeoSiteUrl(cfg.GeoXUrl.GeoSite) + geodata.SetMmdbUrl(cfg.GeoXUrl.Mmdb) + geodata.SetASNUrl(cfg.GeoXUrl.ASN) + mihomoHttp.SetUA(cfg.GlobalUA) if cfg.KeepAliveIdle != 0 { N.KeepAliveIdle = time.Duration(cfg.KeepAliveIdle) * time.Second diff --git a/mihomo/constant/geodata.go b/mihomo/constant/geodata.go deleted file mode 100644 index cd3f74e30c..0000000000 --- a/mihomo/constant/geodata.go +++ /dev/null @@ -1,12 +0,0 @@ -package constant - -var ( - ASNEnable bool - GeodataMode bool - GeoAutoUpdate bool - GeoUpdateInterval int - GeoIpUrl string - MmdbUrl string - GeoSiteUrl string - ASNUrl string -) diff --git a/mihomo/constant/http.go b/mihomo/constant/http.go deleted file mode 100644 index 8e321f6bb0..0000000000 --- a/mihomo/constant/http.go +++ /dev/null @@ -1,5 +0,0 @@ -package constant - -var ( - UA string -) diff --git a/mihomo/constant/provider/interface.go b/mihomo/constant/provider/interface.go index 911f774a62..880bdadff6 100644 --- a/mihomo/constant/provider/interface.go +++ b/mihomo/constant/provider/interface.go @@ -71,6 +71,7 @@ type Provider interface { type ProxyProvider interface { Provider Proxies() []constant.Proxy + Count() int // Touch is used to inform the provider that the proxy is actually being used while getting the list of proxies. // Commonly used in DialContext and DialPacketConn Touch() diff --git a/mihomo/docs/config.yaml b/mihomo/docs/config.yaml index 1da37841cb..78e62d1280 100644 --- a/mihomo/docs/config.yaml +++ b/mihomo/docs/config.yaml @@ -955,12 +955,12 @@ rule-providers: # 对于behavior=domain: # - format=yaml 可以通过“mihomo convert-ruleset domain yaml XXX.yaml XXX.mrs”转换到mrs格式 # - format=text 可以通过“mihomo convert-ruleset domain text XXX.text XXX.mrs”转换到mrs格式 - # - XXX.mrs 可以通过"mihomo convert-ruleset domain mrs XXX.mrs XXX.text"转换回text格式(暂不支持转换回ymal格式) + # - XXX.mrs 可以通过"mihomo convert-ruleset domain mrs XXX.mrs XXX.text"转换回text格式(暂不支持转换回yaml格式) # # 对于behavior=ipcidr: # - format=yaml 可以通过“mihomo convert-ruleset ipcidr yaml XXX.yaml XXX.mrs”转换到mrs格式 # - format=text 可以通过“mihomo convert-ruleset ipcidr text XXX.text XXX.mrs”转换到mrs格式 - # - XXX.mrs 可以通过"mihomo convert-ruleset ipcidr mrs XXX.mrs XXX.text"转换回text格式(暂不支持转换回ymal格式) + # - XXX.mrs 可以通过"mihomo convert-ruleset ipcidr mrs XXX.mrs XXX.text"转换回text格式(暂不支持转换回yaml格式) # type: http url: "url" diff --git a/mihomo/go.mod b/mihomo/go.mod index 75aea3f03a..7121901bbb 100644 --- a/mihomo/go.mod +++ b/mihomo/go.mod @@ -20,7 +20,7 @@ require ( github.com/metacubex/bbolt v0.0.0-20240822011022-aed6d4850399 github.com/metacubex/chacha v0.1.0 github.com/metacubex/gopacket v1.1.20-0.20230608035415-7e2f98a3e759 - github.com/metacubex/quic-go v0.46.1-0.20240807232329-1c6cb2d67f58 + github.com/metacubex/quic-go v0.47.1-0.20240909010619-6b38f24bfcc4 github.com/metacubex/randv2 v0.2.0 github.com/metacubex/sing-quic v0.0.0-20240827003841-cd97758ed8b4 github.com/metacubex/sing-shadowsocks v0.2.8 diff --git a/mihomo/go.sum b/mihomo/go.sum index 40ca026404..3b1d2b5025 100644 --- a/mihomo/go.sum +++ b/mihomo/go.sum @@ -104,8 +104,8 @@ github.com/metacubex/gopacket v1.1.20-0.20230608035415-7e2f98a3e759 h1:cjd4biTvO github.com/metacubex/gopacket v1.1.20-0.20230608035415-7e2f98a3e759/go.mod h1:UHOv2xu+RIgLwpXca7TLrXleEd4oR3sPatW6IF8wU88= github.com/metacubex/gvisor v0.0.0-20240320004321-933faba989ec h1:HxreOiFTUrJXJautEo8rnE1uKTVGY8wtZepY1Tii/Nc= github.com/metacubex/gvisor v0.0.0-20240320004321-933faba989ec/go.mod h1:8BVmQ+3cxjqzWElafm24rb2Ae4jRI6vAXNXWqWjfrXw= -github.com/metacubex/quic-go v0.46.1-0.20240807232329-1c6cb2d67f58 h1:T6OxROLZBr9SOQxN5TzUslv81hEREy/dEgaUKVjaG7U= -github.com/metacubex/quic-go v0.46.1-0.20240807232329-1c6cb2d67f58/go.mod h1:Yza2H7Ax1rxWPUcJx0vW+oAt9EsPuSiyQFhFabUPzwU= +github.com/metacubex/quic-go v0.47.1-0.20240909010619-6b38f24bfcc4 h1:CgdUBRxmNlxEGkp35HwvgQ10jwOOUJKWdOxpi8yWi8o= +github.com/metacubex/quic-go v0.47.1-0.20240909010619-6b38f24bfcc4/go.mod h1:Y7yRGqFE6UQL/3aKPYmiYdjfVkeujJaStP4+jiZMcN8= github.com/metacubex/randv2 v0.2.0 h1:uP38uBvV2SxYfLj53kuvAjbND4RUDfFJjwr4UigMiLs= github.com/metacubex/randv2 v0.2.0/go.mod h1:kFi2SzrQ5WuneuoLLCMkABtiBu6VRrMrWFqSPyj2cxY= github.com/metacubex/sing v0.0.0-20240724044459-6f3cf5896297 h1:YG/JkwGPbca5rUtEMHIu8ZuqzR7BSVm1iqY8hNoMeMA= diff --git a/mihomo/hub/executor/executor.go b/mihomo/hub/executor/executor.go index c83b254c96..fddcc42efa 100644 --- a/mihomo/hub/executor/executor.go +++ b/mihomo/hub/executor/executor.go @@ -17,6 +17,7 @@ import ( "github.com/metacubex/mihomo/component/ca" "github.com/metacubex/mihomo/component/dialer" G "github.com/metacubex/mihomo/component/geodata" + mihomoHttp "github.com/metacubex/mihomo/component/http" "github.com/metacubex/mihomo/component/iface" "github.com/metacubex/mihomo/component/profile" "github.com/metacubex/mihomo/component/profile/cachefile" @@ -81,6 +82,7 @@ func ParseWithBytes(buf []byte) (*config.Config, error) { func ApplyConfig(cfg *config.Config, force bool) { mux.Lock() defer mux.Unlock() + log.SetLevel(cfg.General.LogLevel) tunnel.OnSuspend() @@ -115,8 +117,6 @@ func ApplyConfig(cfg *config.Config, force bool) { tunnel.OnRunning() hcCompatibleProvider(cfg.Providers) initExternalUI() - - log.SetLevel(cfg.General.LogLevel) } func initInnerTcp() { @@ -157,13 +157,13 @@ func GetGeneral() *config.General { Interface: dialer.DefaultInterface.Load(), RoutingMark: int(dialer.DefaultRoutingMark.Load()), GeoXUrl: config.GeoXUrl{ - GeoIp: C.GeoIpUrl, - Mmdb: C.MmdbUrl, - ASN: C.ASNUrl, - GeoSite: C.GeoSiteUrl, + GeoIp: G.GeoIpUrl(), + Mmdb: G.MmdbUrl(), + ASN: G.ASNUrl(), + GeoSite: G.GeoSiteUrl(), }, - GeoAutoUpdate: G.GeoAutoUpdate(), - GeoUpdateInterval: G.GeoUpdateInterval(), + GeoAutoUpdate: updater.GeoAutoUpdate(), + GeoUpdateInterval: updater.GeoUpdateInterval(), GeodataMode: G.GeodataMode(), GeodataLoader: G.LoaderName(), GeositeMatcher: G.SiteMatcherName(), @@ -171,7 +171,7 @@ func GetGeneral() *config.General { FindProcessMode: tunnel.FindProcessMode(), Sniffing: tunnel.IsSniffing(), GlobalClientFingerprint: tlsC.GetGlobalFingerprint(), - GlobalUA: C.UA, + GlobalUA: mihomoHttp.UA(), } return general diff --git a/mihomo/listener/http/server.go b/mihomo/listener/http/server.go index 74e117f265..48f12dc5f1 100644 --- a/mihomo/listener/http/server.go +++ b/mihomo/listener/http/server.go @@ -37,7 +37,7 @@ func New(addr string, tunnel C.Tunnel, additions ...inbound.Addition) (*Listener } // NewWithAuthenticate -// never change type traits because it's used in CFMA +// never change type traits because it's used in CMFA func NewWithAuthenticate(addr string, tunnel C.Tunnel, authenticate bool, additions ...inbound.Addition) (*Listener, error) { getAuth := authStore.Authenticator if !authenticate { diff --git a/mihomo/main.go b/mihomo/main.go index 26f1d2c0c2..8910a00653 100644 --- a/mihomo/main.go +++ b/mihomo/main.go @@ -11,6 +11,7 @@ import ( "strings" "syscall" + "github.com/metacubex/mihomo/component/geodata" "github.com/metacubex/mihomo/component/updater" "github.com/metacubex/mihomo/config" C "github.com/metacubex/mihomo/constant" @@ -78,7 +79,7 @@ func main() { } if geodataMode { - C.GeodataMode = true + geodata.SetGeodataMode(true) } if configString != "" { @@ -140,7 +141,7 @@ func main() { log.Fatalln("Parse config error: %s", err.Error()) } - if C.GeoAutoUpdate { + if updater.GeoAutoUpdate() { updater.RegisterGeoUpdater() } diff --git a/mihomo/rules/common/geoip.go b/mihomo/rules/common/geoip.go index 7d6871c7eb..61fae50443 100644 --- a/mihomo/rules/common/geoip.go +++ b/mihomo/rules/common/geoip.go @@ -46,7 +46,7 @@ func (g *GEOIP) Match(metadata *C.Metadata) (bool, string) { return g.isLan(ip), g.adapter } - if C.GeodataMode { + if geodata.GeodataMode() { if g.isSourceIP { if slices.Contains(metadata.SrcGeoIP, g.country) { return true, g.adapter @@ -102,7 +102,7 @@ func (g *GEOIP) MatchIp(ip netip.Addr) bool { return g.isLan(ip) } - if C.GeodataMode { + if geodata.GeodataMode() { matcher, err := g.getIPMatcher() if err != nil { return false @@ -124,7 +124,7 @@ func (g dnsFallbackFilter) MatchIp(ip netip.Addr) bool { return false } - if C.GeodataMode { + if geodata.GeodataMode() { matcher, err := g.getIPMatcher() if err != nil { return false @@ -170,7 +170,7 @@ func (g *GEOIP) GetCountry() string { } func (g *GEOIP) GetIPMatcher() (router.IPMatcher, error) { - if C.GeodataMode { + if geodata.GeodataMode() { return g.getIPMatcher() } return nil, errors.New("not geodata mode") @@ -193,10 +193,6 @@ func (g *GEOIP) GetRecodeSize() int { } func NewGEOIP(country string, adapter string, isSrc, noResolveIP bool) (*GEOIP, error) { - if err := geodata.InitGeoIP(); err != nil { - log.Errorln("can't initial GeoIP: %s", err) - return nil, err - } country = strings.ToLower(country) geoip := &GEOIP{ @@ -206,11 +202,17 @@ func NewGEOIP(country string, adapter string, isSrc, noResolveIP bool) (*GEOIP, noResolveIP: noResolveIP, isSourceIP: isSrc, } - if !C.GeodataMode || country == "lan" { + + if country == "lan" { return geoip, nil } - if C.GeodataMode { + if err := geodata.InitGeoIP(); err != nil { + log.Errorln("can't initial GeoIP: %s", err) + return nil, err + } + + if geodata.GeodataMode() { geoIPMatcher, err := geoip.getIPMatcher() // test load if err != nil { return nil, err diff --git a/mihomo/rules/common/ipasn.go b/mihomo/rules/common/ipasn.go index bcff4e7251..813923ac1f 100644 --- a/mihomo/rules/common/ipasn.go +++ b/mihomo/rules/common/ipasn.go @@ -63,7 +63,6 @@ func (a *ASN) GetASN() string { } func NewIPASN(asn string, adapter string, isSrc, noResolveIP bool) (*ASN, error) { - C.ASNEnable = true if err := geodata.InitASN(); err != nil { log.Errorln("can't initial ASN: %s", err) return nil, err diff --git a/shadowsocks-rust/Cargo.lock b/shadowsocks-rust/Cargo.lock index 17e68f0582..c0eba4ab2e 100644 --- a/shadowsocks-rust/Cargo.lock +++ b/shadowsocks-rust/Cargo.lock @@ -1814,9 +1814,9 @@ dependencies = [ [[package]] name = "ipnet" -version = "2.9.0" +version = "2.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f518f335dce6725a761382244631d86cf0ccb2863413590b31338feb467f9c3" +checksum = "187674a687eed5fe42285b40c6291f9a01517d415fad1c3cbc6a9f778af7fcd4" [[package]] name = "iprange" diff --git a/shadowsocks-rust/Cargo.toml b/shadowsocks-rust/Cargo.toml index b81b29d02d..22b930eaff 100644 --- a/shadowsocks-rust/Cargo.toml +++ b/shadowsocks-rust/Cargo.toml @@ -240,7 +240,7 @@ rand = "0.8" futures = "0.3" tokio = { version = "1", features = ["rt", "signal"] } -ipnet = { version = "2.9", optional = true } +ipnet = { version = "2.10", optional = true } mimalloc = { version = "0.1", default-features = false, optional = true } tcmalloc = { version = "0.3", optional = true } diff --git a/shadowsocks-rust/crates/shadowsocks-service/Cargo.toml b/shadowsocks-rust/crates/shadowsocks-service/Cargo.toml index 9aa9e596ac..7777de2741 100644 --- a/shadowsocks-rust/crates/shadowsocks-service/Cargo.toml +++ b/shadowsocks-rust/crates/shadowsocks-service/Cargo.toml @@ -177,7 +177,7 @@ hickory-resolver = { version = "0.24", optional = true, features = [ ] } idna = "1.0" -ipnet = "2.9" +ipnet = "2.10" iprange = "0.6" regex = "1.4" diff --git a/shadowsocks-rust/crates/shadowsocks/src/net/sys/unix/bsd/macos.rs b/shadowsocks-rust/crates/shadowsocks/src/net/sys/unix/bsd/macos.rs index 2c27417afc..de3717ee0a 100644 --- a/shadowsocks-rust/crates/shadowsocks/src/net/sys/unix/bsd/macos.rs +++ b/shadowsocks-rust/crates/shadowsocks/src/net/sys/unix/bsd/macos.rs @@ -54,6 +54,10 @@ impl TcpStream { let socket = unsafe { let fd = libc::socket(AF_MULTIPATH, libc::SOCK_STREAM, libc::IPPROTO_TCP); + if fd < 0 { + let err = io::Error::last_os_error(); + return Err(err); + } let socket = Socket::from_raw_fd(fd); socket.set_nonblocking(true)?; TcpSocket::from_raw_fd(socket.into_raw_fd()) diff --git a/shadowsocks-rust/crates/shadowsocks/src/net/sys/unix/linux/mod.rs b/shadowsocks-rust/crates/shadowsocks/src/net/sys/unix/linux/mod.rs index 1122f041d1..f007255a0f 100644 --- a/shadowsocks-rust/crates/shadowsocks/src/net/sys/unix/linux/mod.rs +++ b/shadowsocks-rust/crates/shadowsocks/src/net/sys/unix/linux/mod.rs @@ -213,12 +213,18 @@ pub fn set_tcp_fastopen(socket: &S) -> io::Result<()> { } fn create_mptcp_socket(bind_addr: &SocketAddr) -> io::Result { + // https://www.kernel.org/doc/html/next/networking/mptcp.html + unsafe { let family = match bind_addr { SocketAddr::V4(..) => libc::AF_INET, SocketAddr::V6(..) => libc::AF_INET6, }; let fd = libc::socket(family, libc::SOCK_STREAM, libc::IPPROTO_MPTCP); + if fd < 0 { + let err = io::Error::last_os_error(); + return Err(err); + } let socket = Socket::from_raw_fd(fd); socket.set_nonblocking(true)?; Ok(TcpSocket::from_raw_fd(socket.into_raw_fd())) diff --git a/sing-box/README.md b/sing-box/README.md index 27ad0919dd..7b1c833a42 100644 --- a/sing-box/README.md +++ b/sing-box/README.md @@ -4,9 +4,9 @@ The universal proxy platform. [![Packaging status](https://repology.org/badge/vertical-allrepos/sing-box.svg)](https://repology.org/project/sing-box/versions) -## Support +## Documentation -https://community.sagernet.org/c/sing-box/ +https://sing-box.sagernet.org ## License diff --git a/sing-box/docs/changelog.md b/sing-box/docs/changelog.md index 4c0b4e1563..e9202efe63 100644 --- a/sing-box/docs/changelog.md +++ b/sing-box/docs/changelog.md @@ -8,6 +8,11 @@ icon: material/alert-decagram If your company or organization is willing to help us return to the App Store, please [contact us](mailto:contact@sagernet.org). +#### 1.10.0-beta.7 + +* Update quic-go to v0.47.0 +* Fixes and improvements + #### 1.10.0-beta.6 * Add RDP sniffer diff --git a/sing-box/go.mod b/sing-box/go.mod index 749559ca3d..2988930f4d 100644 --- a/sing-box/go.mod +++ b/sing-box/go.mod @@ -25,7 +25,7 @@ require ( github.com/sagernet/fswatch v0.1.1 github.com/sagernet/gomobile v0.1.3 github.com/sagernet/gvisor v0.0.0-20240428053021-e691de28565f - github.com/sagernet/quic-go v0.46.0-beta.4 + github.com/sagernet/quic-go v0.47.0-beta.2 github.com/sagernet/reality v0.0.0-20230406110435-ee17307e7691 github.com/sagernet/sing v0.5.0-beta.1 github.com/sagernet/sing-dns v0.3.0-beta.14 @@ -47,7 +47,7 @@ require ( golang.org/x/crypto v0.25.0 golang.org/x/exp v0.0.0-20240719175910-8a7402abbf56 golang.org/x/net v0.27.0 - golang.org/x/sys v0.22.0 + golang.org/x/sys v0.25.0 golang.zx2c4.com/wireguard/wgctrl v0.0.0-20230429144221-925a1e7659e6 google.golang.org/grpc v1.63.2 google.golang.org/protobuf v1.33.0 @@ -91,8 +91,8 @@ require ( github.com/zeebo/blake3 v0.2.3 // indirect go.uber.org/multierr v1.11.0 // indirect golang.org/x/mod v0.19.0 // indirect - golang.org/x/sync v0.7.0 // indirect - golang.org/x/text v0.16.0 // indirect + golang.org/x/sync v0.8.0 // indirect + golang.org/x/text v0.18.0 // indirect golang.org/x/time v0.5.0 // indirect golang.org/x/tools v0.23.0 // indirect google.golang.org/genproto/googleapis/rpc v0.0.0-20240227224415-6ceb2ff114de // indirect diff --git a/sing-box/go.sum b/sing-box/go.sum index 1335938ebd..34f48dde53 100644 --- a/sing-box/go.sum +++ b/sing-box/go.sum @@ -112,8 +112,8 @@ github.com/sagernet/netlink v0.0.0-20240612041022-b9a21c07ac6a h1:ObwtHN2VpqE0ZN github.com/sagernet/netlink v0.0.0-20240612041022-b9a21c07ac6a/go.mod h1:xLnfdiJbSp8rNqYEdIW/6eDO4mVoogml14Bh2hSiFpM= github.com/sagernet/nftables v0.3.0-beta.4 h1:kbULlAwAC3jvdGAC1P5Fa3GSxVwQJibNenDW2zaXr8I= github.com/sagernet/nftables v0.3.0-beta.4/go.mod h1:OQXAjvjNGGFxaTgVCSTRIhYB5/llyVDeapVoENYBDS8= -github.com/sagernet/quic-go v0.46.0-beta.4 h1:k9f7VSKaM47AY6MPND0Qf1KRN7HwimPg9zdOFTXTiCk= -github.com/sagernet/quic-go v0.46.0-beta.4/go.mod h1:zJmVdJUNqEDXfubf4KtIOUHHerggjBduiGRLNzJspcM= +github.com/sagernet/quic-go v0.47.0-beta.2 h1:1tCGWFOSaXIeuQaHrwOMJIYvlupjTcaVInGQw5ArULU= +github.com/sagernet/quic-go v0.47.0-beta.2/go.mod h1:bLVKvElSEMNv7pu7SZHscW02TYigzQ5lQu3Nh4wNh8Q= github.com/sagernet/reality v0.0.0-20230406110435-ee17307e7691 h1:5Th31OC6yj8byLGkEnIYp6grlXfo1QYUfiYFGjewIdc= github.com/sagernet/reality v0.0.0-20230406110435-ee17307e7691/go.mod h1:B8lp4WkQ1PwNnrVMM6KyuFR20pU8jYBD+A4EhJovEXU= github.com/sagernet/sing v0.2.18/go.mod h1:OL6k2F0vHmEzXz2KW19qQzu172FDgSbUSODylighuVo= @@ -182,8 +182,8 @@ golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v golang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.27.0 h1:5K3Njcw06/l2y9vpGCSdcxWOYHOUk3dVNGDXN+FvAys= golang.org/x/net v0.27.0/go.mod h1:dDi0PyhWNoiUOrAS8uXv/vnScO4wnHQO4mj9fn/RytE= -golang.org/x/sync v0.7.0 h1:YsImfSBoP9QPYL0xyKJPq0gcaJdG3rInoqxTWbfQu9M= -golang.org/x/sync v0.7.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= +golang.org/x/sync v0.8.0 h1:3NFvSEYkUoMifnESzZl15y791HH1qU2xm6eCJU5ZPXQ= +golang.org/x/sync v0.8.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sys v0.0.0-20190403152447-81d4e9dc473e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -192,14 +192,14 @@ golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.14.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/sys v0.22.0 h1:RI27ohtqKCnwULzJLqkv897zojh5/DwS/ENaMzUOaWI= -golang.org/x/sys v0.22.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.25.0 h1:r+8e+loiHxRqhXVl6ML1nO3l1+oFoWbnlu2Ehimmi34= +golang.org/x/sys v0.25.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.22.0 h1:BbsgPEJULsl2fV/AT3v15Mjva5yXKQDyKf+TbDz7QJk= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.16.0 h1:a94ExnEXNtEwYLGJSIUxnWoxoRz/ZcCsV63ROupILh4= -golang.org/x/text v0.16.0/go.mod h1:GhwF1Be+LQoKShO3cGOHzqOgRrGaYc9AvblQOmPVHnI= +golang.org/x/text v0.18.0 h1:XvMDiNzPAl0jr17s6W9lcaIhGUfUORdGCNsuLmPG224= +golang.org/x/text v0.18.0/go.mod h1:BuEKDfySbSR4drPmRPG/7iBdf8hvFMuRexcpahXilzY= golang.org/x/time v0.5.0 h1:o7cqy6amK/52YcAKIPlM3a+Fpj35zvRj2TP+e1xFSfk= golang.org/x/time v0.5.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= diff --git a/small/.github/workflows/T2 build.yml b/small/.github/workflows/T2 build.yml index 8a2b96e191..bb09b275cb 100644 --- a/small/.github/workflows/T2 build.yml +++ b/small/.github/workflows/T2 build.yml @@ -29,7 +29,7 @@ jobs: env: ARCH: ${{ matrix.arch }}-${{ matrix.sdk }} FEEDNAME: packages_ci - PACKAGES: luci-app-homeproxy luci-app-passwall luci-app-passwall2 luci-app-ssr-plus luci-app-bypass brook hysteria ipt2socks pdnsd-alt redsocks2 shadow-tls trojan tuic-client xray-plugin v2ray-core v2ray-geodata naiveproxy sing-box + PACKAGES: luci-app-homeproxy luci-app-mihomo luci-app-passwall luci-app-passwall2 luci-app-ssr-plus luci-app-bypass brook hysteria ipt2socks pdnsd-alt redsocks2 shadow-tls trojan tuic-client xray-plugin v2ray-core v2ray-geodata naiveproxy sing-box NO_REFRESH_CHECK: true IGNORE_ERRORS: true diff --git a/small/v2ray-core/Makefile b/small/v2ray-core/Makefile index 0a299ff3ee..8911524acc 100644 --- a/small/v2ray-core/Makefile +++ b/small/v2ray-core/Makefile @@ -5,12 +5,12 @@ include $(TOPDIR)/rules.mk PKG_NAME:=v2ray-core -PKG_VERSION:=5.17.1 +PKG_VERSION:=5.18.0 PKG_RELEASE:=1 PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz PKG_SOURCE_URL:=https://codeload.github.com/v2fly/v2ray-core/tar.gz/v$(PKG_VERSION)? -PKG_HASH:=e6798d1a29f6a52a3c0cc7176803b73e292427bc7858d534d0529a278936b8b0 +PKG_HASH:=15acf65228867d47dcab27f87af048a2f0e6ed5d347a2e68730d30ae2a3871eb PKG_LICENSE:=MIT PKG_LICENSE_FILES:=LICENSE diff --git a/small/v2ray-geodata/Makefile b/small/v2ray-geodata/Makefile index 1b994c8c83..c058b933ae 100644 --- a/small/v2ray-geodata/Makefile +++ b/small/v2ray-geodata/Makefile @@ -30,13 +30,13 @@ define Download/geosite HASH:=af7a202728ceab4e049eb38cba31136ef3d7eca7bf56e62fba10eaa7117820c7 endef -GEOSITE_IRAN_VER:=202409020032 +GEOSITE_IRAN_VER:=202409090033 GEOSITE_IRAN_FILE:=iran.dat.$(GEOSITE_IRAN_VER) define Download/geosite-ir URL:=https://github.com/bootmortis/iran-hosted-domains/releases/download/$(GEOSITE_IRAN_VER)/ URL_FILE:=iran.dat FILE:=$(GEOSITE_IRAN_FILE) - HASH:=ec146949ced882d20eb1dd2ada61e00d67bef758bd3772c312e952ccd3693d74 + HASH:=661a65a42608fe77610b04b20e209b34d83160fce7ced3980ac86e78d5fbb56f endef define Package/v2ray-geodata/template diff --git a/xray-core/README.md b/xray-core/README.md index 9485f944c9..016a65d4b5 100644 --- a/xray-core/README.md +++ b/xray-core/README.md @@ -77,6 +77,7 @@ - Android - [v2rayNG](https://github.com/2dust/v2rayNG) - [X-flutter](https://github.com/XTLS/X-flutter) + - [SaeedDev94/Xray](https://github.com/SaeedDev94/Xray) - iOS & macOS arm64 - [FoXray](https://apps.apple.com/app/foxray/id6448898396) - [Streisand](https://apps.apple.com/app/streisand/id6450534064) diff --git a/xray-core/app/proxyman/config.go b/xray-core/app/proxyman/config.go index 73c00c74a1..76d7a194b5 100644 --- a/xray-core/app/proxyman/config.go +++ b/xray-core/app/proxyman/config.go @@ -19,21 +19,5 @@ func (c *ReceiverConfig) GetEffectiveSniffingSettings() *SniffingConfig { return c.SniffingSettings } - if len(c.DomainOverride) > 0 { - var p []string - for _, kd := range c.DomainOverride { - switch kd { - case KnownProtocols_HTTP: - p = append(p, "http") - case KnownProtocols_TLS: - p = append(p, "tls") - } - } - return &SniffingConfig{ - Enabled: true, - DestinationOverride: p, - } - } - return nil } diff --git a/xray-core/app/proxyman/config.pb.go b/xray-core/app/proxyman/config.pb.go index aed85b9875..5ba3ac56a6 100644 --- a/xray-core/app/proxyman/config.pb.go +++ b/xray-core/app/proxyman/config.pb.go @@ -1,7 +1,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.34.2 -// protoc v5.27.0 +// protoc v5.28.0 // source: app/proxyman/config.proto package proxyman @@ -23,52 +23,6 @@ const ( _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) ) -type KnownProtocols int32 - -const ( - KnownProtocols_HTTP KnownProtocols = 0 - KnownProtocols_TLS KnownProtocols = 1 -) - -// Enum value maps for KnownProtocols. -var ( - KnownProtocols_name = map[int32]string{ - 0: "HTTP", - 1: "TLS", - } - KnownProtocols_value = map[string]int32{ - "HTTP": 0, - "TLS": 1, - } -) - -func (x KnownProtocols) Enum() *KnownProtocols { - p := new(KnownProtocols) - *p = x - return p -} - -func (x KnownProtocols) String() string { - return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) -} - -func (KnownProtocols) Descriptor() protoreflect.EnumDescriptor { - return file_app_proxyman_config_proto_enumTypes[0].Descriptor() -} - -func (KnownProtocols) Type() protoreflect.EnumType { - return &file_app_proxyman_config_proto_enumTypes[0] -} - -func (x KnownProtocols) Number() protoreflect.EnumNumber { - return protoreflect.EnumNumber(x) -} - -// Deprecated: Use KnownProtocols.Descriptor instead. -func (KnownProtocols) EnumDescriptor() ([]byte, []int) { - return file_app_proxyman_config_proto_rawDescGZIP(), []int{0} -} - type AllocationStrategy_Type int32 const ( @@ -105,11 +59,11 @@ func (x AllocationStrategy_Type) String() string { } func (AllocationStrategy_Type) Descriptor() protoreflect.EnumDescriptor { - return file_app_proxyman_config_proto_enumTypes[1].Descriptor() + return file_app_proxyman_config_proto_enumTypes[0].Descriptor() } func (AllocationStrategy_Type) Type() protoreflect.EnumType { - return &file_app_proxyman_config_proto_enumTypes[1] + return &file_app_proxyman_config_proto_enumTypes[0] } func (x AllocationStrategy_Type) Number() protoreflect.EnumNumber { @@ -323,12 +277,7 @@ type ReceiverConfig struct { AllocationStrategy *AllocationStrategy `protobuf:"bytes,3,opt,name=allocation_strategy,json=allocationStrategy,proto3" json:"allocation_strategy,omitempty"` StreamSettings *internet.StreamConfig `protobuf:"bytes,4,opt,name=stream_settings,json=streamSettings,proto3" json:"stream_settings,omitempty"` ReceiveOriginalDestination bool `protobuf:"varint,5,opt,name=receive_original_destination,json=receiveOriginalDestination,proto3" json:"receive_original_destination,omitempty"` - // Override domains for the given protocol. - // Deprecated. Use sniffing_settings. - // - // Deprecated: Marked as deprecated in app/proxyman/config.proto. - DomainOverride []KnownProtocols `protobuf:"varint,7,rep,packed,name=domain_override,json=domainOverride,proto3,enum=xray.app.proxyman.KnownProtocols" json:"domain_override,omitempty"` - SniffingSettings *SniffingConfig `protobuf:"bytes,8,opt,name=sniffing_settings,json=sniffingSettings,proto3" json:"sniffing_settings,omitempty"` + SniffingSettings *SniffingConfig `protobuf:"bytes,7,opt,name=sniffing_settings,json=sniffingSettings,proto3" json:"sniffing_settings,omitempty"` } func (x *ReceiverConfig) Reset() { @@ -398,14 +347,6 @@ func (x *ReceiverConfig) GetReceiveOriginalDestination() bool { return false } -// Deprecated: Marked as deprecated in app/proxyman/config.proto. -func (x *ReceiverConfig) GetDomainOverride() []KnownProtocols { - if x != nil { - return x.DomainOverride - } - return nil -} - func (x *ReceiverConfig) GetSniffingSettings() *SniffingConfig { if x != nil { return x.SniffingSettings @@ -817,7 +758,7 @@ var file_app_proxyman_config_proto_rawDesc = []byte{ 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x4f, 0x6e, 0x6c, 0x79, 0x12, 0x1d, 0x0a, 0x0a, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x5f, 0x6f, 0x6e, 0x6c, 0x79, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x72, 0x6f, 0x75, 0x74, 0x65, - 0x4f, 0x6e, 0x6c, 0x79, 0x22, 0x8d, 0x04, 0x0a, 0x0e, 0x52, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, + 0x4f, 0x6e, 0x6c, 0x79, 0x22, 0xbd, 0x03, 0x0a, 0x0e, 0x52, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x36, 0x0a, 0x09, 0x70, 0x6f, 0x72, 0x74, 0x5f, 0x6c, 0x69, 0x73, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x78, 0x72, 0x61, 0x79, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x6e, 0x65, 0x74, 0x2e, 0x50, 0x6f, 0x72, @@ -840,13 +781,8 @@ var file_app_proxyman_config_proto_rawDesc = []byte{ 0x5f, 0x64, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x1a, 0x72, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x4f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x61, 0x6c, 0x44, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x4e, - 0x0a, 0x0f, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x5f, 0x6f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, - 0x65, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x21, 0x2e, 0x78, 0x72, 0x61, 0x79, 0x2e, 0x61, - 0x70, 0x70, 0x2e, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x6d, 0x61, 0x6e, 0x2e, 0x4b, 0x6e, 0x6f, 0x77, - 0x6e, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x73, 0x42, 0x02, 0x18, 0x01, 0x52, 0x0e, - 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x4f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x65, 0x12, 0x4e, 0x0a, 0x11, 0x73, 0x6e, 0x69, 0x66, 0x66, 0x69, 0x6e, 0x67, 0x5f, 0x73, 0x65, 0x74, 0x74, 0x69, - 0x6e, 0x67, 0x73, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x78, 0x72, 0x61, 0x79, + 0x6e, 0x67, 0x73, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x78, 0x72, 0x61, 0x79, 0x2e, 0x61, 0x70, 0x70, 0x2e, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x6d, 0x61, 0x6e, 0x2e, 0x53, 0x6e, 0x69, 0x66, 0x66, 0x69, 0x6e, 0x67, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x10, 0x73, 0x6e, 0x69, 0x66, 0x66, 0x69, 0x6e, 0x67, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x4a, 0x04, @@ -894,16 +830,13 @@ var file_app_proxyman_config_proto_rawDesc = []byte{ 0x01, 0x28, 0x05, 0x52, 0x0f, 0x78, 0x75, 0x64, 0x70, 0x43, 0x6f, 0x6e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x63, 0x79, 0x12, 0x28, 0x0a, 0x0f, 0x78, 0x75, 0x64, 0x70, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x55, 0x44, 0x50, 0x34, 0x34, 0x33, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x78, - 0x75, 0x64, 0x70, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x55, 0x44, 0x50, 0x34, 0x34, 0x33, 0x2a, 0x23, - 0x0a, 0x0e, 0x4b, 0x6e, 0x6f, 0x77, 0x6e, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x73, - 0x12, 0x08, 0x0a, 0x04, 0x48, 0x54, 0x54, 0x50, 0x10, 0x00, 0x12, 0x07, 0x0a, 0x03, 0x54, 0x4c, - 0x53, 0x10, 0x01, 0x42, 0x55, 0x0a, 0x15, 0x63, 0x6f, 0x6d, 0x2e, 0x78, 0x72, 0x61, 0x79, 0x2e, - 0x61, 0x70, 0x70, 0x2e, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x6d, 0x61, 0x6e, 0x50, 0x01, 0x5a, 0x26, - 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x78, 0x74, 0x6c, 0x73, 0x2f, - 0x78, 0x72, 0x61, 0x79, 0x2d, 0x63, 0x6f, 0x72, 0x65, 0x2f, 0x61, 0x70, 0x70, 0x2f, 0x70, 0x72, - 0x6f, 0x78, 0x79, 0x6d, 0x61, 0x6e, 0xaa, 0x02, 0x11, 0x58, 0x72, 0x61, 0x79, 0x2e, 0x41, 0x70, - 0x70, 0x2e, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x6d, 0x61, 0x6e, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x33, + 0x75, 0x64, 0x70, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x55, 0x44, 0x50, 0x34, 0x34, 0x33, 0x42, 0x55, + 0x0a, 0x15, 0x63, 0x6f, 0x6d, 0x2e, 0x78, 0x72, 0x61, 0x79, 0x2e, 0x61, 0x70, 0x70, 0x2e, 0x70, + 0x72, 0x6f, 0x78, 0x79, 0x6d, 0x61, 0x6e, 0x50, 0x01, 0x5a, 0x26, 0x67, 0x69, 0x74, 0x68, 0x75, + 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x78, 0x74, 0x6c, 0x73, 0x2f, 0x78, 0x72, 0x61, 0x79, 0x2d, + 0x63, 0x6f, 0x72, 0x65, 0x2f, 0x61, 0x70, 0x70, 0x2f, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x6d, 0x61, + 0x6e, 0xaa, 0x02, 0x11, 0x58, 0x72, 0x61, 0x79, 0x2e, 0x41, 0x70, 0x70, 0x2e, 0x50, 0x72, 0x6f, + 0x78, 0x79, 0x6d, 0x61, 0x6e, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -918,48 +851,46 @@ func file_app_proxyman_config_proto_rawDescGZIP() []byte { return file_app_proxyman_config_proto_rawDescData } -var file_app_proxyman_config_proto_enumTypes = make([]protoimpl.EnumInfo, 2) +var file_app_proxyman_config_proto_enumTypes = make([]protoimpl.EnumInfo, 1) var file_app_proxyman_config_proto_msgTypes = make([]protoimpl.MessageInfo, 10) var file_app_proxyman_config_proto_goTypes = []any{ - (KnownProtocols)(0), // 0: xray.app.proxyman.KnownProtocols - (AllocationStrategy_Type)(0), // 1: xray.app.proxyman.AllocationStrategy.Type - (*InboundConfig)(nil), // 2: xray.app.proxyman.InboundConfig - (*AllocationStrategy)(nil), // 3: xray.app.proxyman.AllocationStrategy - (*SniffingConfig)(nil), // 4: xray.app.proxyman.SniffingConfig - (*ReceiverConfig)(nil), // 5: xray.app.proxyman.ReceiverConfig - (*InboundHandlerConfig)(nil), // 6: xray.app.proxyman.InboundHandlerConfig - (*OutboundConfig)(nil), // 7: xray.app.proxyman.OutboundConfig - (*SenderConfig)(nil), // 8: xray.app.proxyman.SenderConfig - (*MultiplexingConfig)(nil), // 9: xray.app.proxyman.MultiplexingConfig - (*AllocationStrategy_AllocationStrategyConcurrency)(nil), // 10: xray.app.proxyman.AllocationStrategy.AllocationStrategyConcurrency - (*AllocationStrategy_AllocationStrategyRefresh)(nil), // 11: xray.app.proxyman.AllocationStrategy.AllocationStrategyRefresh - (*net.PortList)(nil), // 12: xray.common.net.PortList - (*net.IPOrDomain)(nil), // 13: xray.common.net.IPOrDomain - (*internet.StreamConfig)(nil), // 14: xray.transport.internet.StreamConfig - (*serial.TypedMessage)(nil), // 15: xray.common.serial.TypedMessage - (*internet.ProxyConfig)(nil), // 16: xray.transport.internet.ProxyConfig + (AllocationStrategy_Type)(0), // 0: xray.app.proxyman.AllocationStrategy.Type + (*InboundConfig)(nil), // 1: xray.app.proxyman.InboundConfig + (*AllocationStrategy)(nil), // 2: xray.app.proxyman.AllocationStrategy + (*SniffingConfig)(nil), // 3: xray.app.proxyman.SniffingConfig + (*ReceiverConfig)(nil), // 4: xray.app.proxyman.ReceiverConfig + (*InboundHandlerConfig)(nil), // 5: xray.app.proxyman.InboundHandlerConfig + (*OutboundConfig)(nil), // 6: xray.app.proxyman.OutboundConfig + (*SenderConfig)(nil), // 7: xray.app.proxyman.SenderConfig + (*MultiplexingConfig)(nil), // 8: xray.app.proxyman.MultiplexingConfig + (*AllocationStrategy_AllocationStrategyConcurrency)(nil), // 9: xray.app.proxyman.AllocationStrategy.AllocationStrategyConcurrency + (*AllocationStrategy_AllocationStrategyRefresh)(nil), // 10: xray.app.proxyman.AllocationStrategy.AllocationStrategyRefresh + (*net.PortList)(nil), // 11: xray.common.net.PortList + (*net.IPOrDomain)(nil), // 12: xray.common.net.IPOrDomain + (*internet.StreamConfig)(nil), // 13: xray.transport.internet.StreamConfig + (*serial.TypedMessage)(nil), // 14: xray.common.serial.TypedMessage + (*internet.ProxyConfig)(nil), // 15: xray.transport.internet.ProxyConfig } var file_app_proxyman_config_proto_depIdxs = []int32{ - 1, // 0: xray.app.proxyman.AllocationStrategy.type:type_name -> xray.app.proxyman.AllocationStrategy.Type - 10, // 1: xray.app.proxyman.AllocationStrategy.concurrency:type_name -> xray.app.proxyman.AllocationStrategy.AllocationStrategyConcurrency - 11, // 2: xray.app.proxyman.AllocationStrategy.refresh:type_name -> xray.app.proxyman.AllocationStrategy.AllocationStrategyRefresh - 12, // 3: xray.app.proxyman.ReceiverConfig.port_list:type_name -> xray.common.net.PortList - 13, // 4: xray.app.proxyman.ReceiverConfig.listen:type_name -> xray.common.net.IPOrDomain - 3, // 5: xray.app.proxyman.ReceiverConfig.allocation_strategy:type_name -> xray.app.proxyman.AllocationStrategy - 14, // 6: xray.app.proxyman.ReceiverConfig.stream_settings:type_name -> xray.transport.internet.StreamConfig - 0, // 7: xray.app.proxyman.ReceiverConfig.domain_override:type_name -> xray.app.proxyman.KnownProtocols - 4, // 8: xray.app.proxyman.ReceiverConfig.sniffing_settings:type_name -> xray.app.proxyman.SniffingConfig - 15, // 9: xray.app.proxyman.InboundHandlerConfig.receiver_settings:type_name -> xray.common.serial.TypedMessage - 15, // 10: xray.app.proxyman.InboundHandlerConfig.proxy_settings:type_name -> xray.common.serial.TypedMessage - 13, // 11: xray.app.proxyman.SenderConfig.via:type_name -> xray.common.net.IPOrDomain - 14, // 12: xray.app.proxyman.SenderConfig.stream_settings:type_name -> xray.transport.internet.StreamConfig - 16, // 13: xray.app.proxyman.SenderConfig.proxy_settings:type_name -> xray.transport.internet.ProxyConfig - 9, // 14: xray.app.proxyman.SenderConfig.multiplex_settings:type_name -> xray.app.proxyman.MultiplexingConfig - 15, // [15:15] is the sub-list for method output_type - 15, // [15:15] is the sub-list for method input_type - 15, // [15:15] is the sub-list for extension type_name - 15, // [15:15] is the sub-list for extension extendee - 0, // [0:15] is the sub-list for field type_name + 0, // 0: xray.app.proxyman.AllocationStrategy.type:type_name -> xray.app.proxyman.AllocationStrategy.Type + 9, // 1: xray.app.proxyman.AllocationStrategy.concurrency:type_name -> xray.app.proxyman.AllocationStrategy.AllocationStrategyConcurrency + 10, // 2: xray.app.proxyman.AllocationStrategy.refresh:type_name -> xray.app.proxyman.AllocationStrategy.AllocationStrategyRefresh + 11, // 3: xray.app.proxyman.ReceiverConfig.port_list:type_name -> xray.common.net.PortList + 12, // 4: xray.app.proxyman.ReceiverConfig.listen:type_name -> xray.common.net.IPOrDomain + 2, // 5: xray.app.proxyman.ReceiverConfig.allocation_strategy:type_name -> xray.app.proxyman.AllocationStrategy + 13, // 6: xray.app.proxyman.ReceiverConfig.stream_settings:type_name -> xray.transport.internet.StreamConfig + 3, // 7: xray.app.proxyman.ReceiverConfig.sniffing_settings:type_name -> xray.app.proxyman.SniffingConfig + 14, // 8: xray.app.proxyman.InboundHandlerConfig.receiver_settings:type_name -> xray.common.serial.TypedMessage + 14, // 9: xray.app.proxyman.InboundHandlerConfig.proxy_settings:type_name -> xray.common.serial.TypedMessage + 12, // 10: xray.app.proxyman.SenderConfig.via:type_name -> xray.common.net.IPOrDomain + 13, // 11: xray.app.proxyman.SenderConfig.stream_settings:type_name -> xray.transport.internet.StreamConfig + 15, // 12: xray.app.proxyman.SenderConfig.proxy_settings:type_name -> xray.transport.internet.ProxyConfig + 8, // 13: xray.app.proxyman.SenderConfig.multiplex_settings:type_name -> xray.app.proxyman.MultiplexingConfig + 14, // [14:14] is the sub-list for method output_type + 14, // [14:14] is the sub-list for method input_type + 14, // [14:14] is the sub-list for extension type_name + 14, // [14:14] is the sub-list for extension extendee + 0, // [0:14] is the sub-list for field type_name } func init() { file_app_proxyman_config_proto_init() } @@ -1094,7 +1025,7 @@ func file_app_proxyman_config_proto_init() { File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_app_proxyman_config_proto_rawDesc, - NumEnums: 2, + NumEnums: 1, NumMessages: 10, NumExtensions: 0, NumServices: 0, diff --git a/xray-core/app/proxyman/config.proto b/xray-core/app/proxyman/config.proto index fe18c378f6..635ffad2f5 100644 --- a/xray-core/app/proxyman/config.proto +++ b/xray-core/app/proxyman/config.proto @@ -40,11 +40,6 @@ message AllocationStrategy { AllocationStrategyRefresh refresh = 3; } -enum KnownProtocols { - HTTP = 0; - TLS = 1; -} - message SniffingConfig { // Whether or not to enable content sniffing on an inbound connection. bool enabled = 1; @@ -71,10 +66,7 @@ message ReceiverConfig { xray.transport.internet.StreamConfig stream_settings = 4; bool receive_original_destination = 5; reserved 6; - // Override domains for the given protocol. - // Deprecated. Use sniffing_settings. - repeated KnownProtocols domain_override = 7 [ deprecated = true ]; - SniffingConfig sniffing_settings = 8; + SniffingConfig sniffing_settings = 7; } message InboundHandlerConfig { diff --git a/xray-core/infra/conf/vmess.go b/xray-core/infra/conf/vmess.go index 23eb694838..90ab92d421 100644 --- a/xray-core/infra/conf/vmess.go +++ b/xray-core/infra/conf/vmess.go @@ -57,10 +57,6 @@ func (c *VMessDetourConfig) Build() *inbound.DetourConfig { } } -type FeaturesConfig struct { - Detour *VMessDetourConfig `json:"detour"` -} - type VMessDefaultConfig struct { Level byte `json:"level"` } @@ -74,7 +70,6 @@ func (c *VMessDefaultConfig) Build() *inbound.DefaultConfig { type VMessInboundConfig struct { Users []json.RawMessage `json:"clients"` - Features *FeaturesConfig `json:"features"` Defaults *VMessDefaultConfig `json:"default"` DetourConfig *VMessDetourConfig `json:"detour"` } @@ -89,8 +84,6 @@ func (c *VMessInboundConfig) Build() (proto.Message, error) { if c.DetourConfig != nil { config.Detour = c.DetourConfig.Build() - } else if c.Features != nil && c.Features.Detour != nil { - config.Detour = c.Features.Detour.Build() } config.User = make([]*protocol.User, len(c.Users)) diff --git a/xray-core/infra/conf/xray.go b/xray-core/infra/conf/xray.go index cce7c3bf6c..6daca0f724 100644 --- a/xray-core/infra/conf/xray.go +++ b/xray-core/infra/conf/xray.go @@ -48,21 +48,6 @@ var ( ctllog = log.New(os.Stderr, "xctl> ", 0) ) -func toProtocolList(s []string) ([]proxyman.KnownProtocols, error) { - kp := make([]proxyman.KnownProtocols, 0, 8) - for _, p := range s { - switch strings.ToLower(p) { - case "http": - kp = append(kp, proxyman.KnownProtocols_HTTP) - case "https", "tls", "ssl": - kp = append(kp, proxyman.KnownProtocols_TLS) - default: - return nil, errors.New("Unknown protocol: ", p) - } - } - return kp, nil -} - type SniffingConfig struct { Enabled bool `json:"enabled"` DestOverride *StringList `json:"destOverride"` @@ -175,7 +160,6 @@ type InboundDetourConfig struct { Tag string `json:"tag"` Allocation *InboundDetourAllocationConfig `json:"allocate"` StreamSetting *StreamConfig `json:"streamSettings"` - DomainOverride *StringList `json:"domainOverride"` SniffingConfig *SniffingConfig `json:"sniffing"` } @@ -249,13 +233,6 @@ func (c *InboundDetourConfig) Build() (*core.InboundHandlerConfig, error) { } receiverSettings.SniffingSettings = s } - if c.DomainOverride != nil { - kp, err := toProtocolList(*c.DomainOverride) - if err != nil { - return nil, errors.New("failed to parse inbound detour config").Base(err) - } - receiverSettings.DomainOverride = kp - } settings := []byte("{}") if c.Settings != nil { diff --git a/xray-core/proxy/vmess/validator.go b/xray-core/proxy/vmess/validator.go index 00e49ae260..43ced00638 100644 --- a/xray-core/proxy/vmess/validator.go +++ b/xray-core/proxy/vmess/validator.go @@ -39,7 +39,10 @@ func (v *TimedUserValidator) Add(u *protocol.MemoryUser) error { v.users = append(v.users, u) - account := u.Account.(*MemoryAccount) + account, ok := u.Account.(*MemoryAccount) + if !ok { + return errors.New("account type is incorrect") + } if !v.behaviorFused { hashkdf := hmac.New(sha256.New, []byte("VMESSBSKDF")) hashkdf.Write(account.ID.Bytes()) diff --git a/xray-core/testing/scenarios/feature_test.go b/xray-core/testing/scenarios/feature_test.go index bee4598f90..0e2f8785d1 100644 --- a/xray-core/testing/scenarios/feature_test.go +++ b/xray-core/testing/scenarios/feature_test.go @@ -560,8 +560,9 @@ func TestDomainSniffing(t *testing.T) { ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{ PortList: &net.PortList{Range: []*net.PortRange{net.SinglePortRange(sniffingPort)}}, Listen: net.NewIPOrDomain(net.LocalHostIP), - DomainOverride: []proxyman.KnownProtocols{ - proxyman.KnownProtocols_TLS, + SniffingSettings: &proxyman.SniffingConfig{ + Enabled: true, + DestinationOverride: []string{"tls"}, }, }), ProxySettings: serial.ToTypedMessage(&dokodemo.Config{ diff --git a/xray-core/transport/internet/reality/reality.go b/xray-core/transport/internet/reality/reality.go index 8c77e79f40..44402f313a 100644 --- a/xray-core/transport/internet/reality/reality.go +++ b/xray-core/transport/internet/reality/reality.go @@ -140,6 +140,9 @@ func UClient(c net.Conn, config *Config, ctx context.Context, dest net.Destinati if err != nil { return nil, errors.New("REALITY: publicKey == nil") } + if uConn.HandshakeState.State13.EcdheKey == nil { + return nil, errors.New("Current fingerprint ", uConn.ClientHelloID.Client, uConn.ClientHelloID.Version, " does not support TLS 1.3, REALITY handshake cannot establish.") + } uConn.AuthKey, _ = uConn.HandshakeState.State13.EcdheKey.ECDH(publicKey) if uConn.AuthKey == nil { return nil, errors.New("REALITY: SharedKey == nil") diff --git a/yass/CMakeLists.txt b/yass/CMakeLists.txt index 99e866c072..ff1cc4ad45 100644 --- a/yass/CMakeLists.txt +++ b/yass/CMakeLists.txt @@ -513,6 +513,12 @@ option(ENABLE_LLD "Enable build with LLD" OFF) option(USE_MOLD "Build with mold linker" OFF) option(USE_LLD "Build with lld linker" OFF) +# this temporary fix is not working with tests +# https://discourse.cmake.org/t/dsym-file-not-copied-when-archiving/7691/2 +cmake_dependent_option( + IOS_XCODE_DSYM_FOLDER_FIX "Build with xcode dsym folder fixes" OFF + "IOS AND NOT BUILD_TESTS" OFF) + cmake_dependent_option(USE_CET "Build with CET support" OFF "LINUX OR MSVC; OS_X64 OR OS_X86" OFF) @@ -4872,6 +4878,9 @@ if (GUI) XCODE_ATTRIBUTE_DEVELOPMENT_TEAM "${XCODE_DEPLOYMENT_TEAM}" XCODE_ATTRIBUTE_CODE_SIGN_STYLE "Automatic") endif() + if (IOS_XCODE_DSYM_FOLDER_FIX) + set_target_properties(${APP_NAME} PROPERTIES XCODE_ATTRIBUTE_CONFIGURATION_BUILD_DIR "$(inherited)") + endif() # ======================= # YassPacketTunnel extensions @@ -4939,6 +4948,10 @@ if (GUI) XCODE_ATTRIBUTE_CODE_SIGN_STYLE "Automatic") endif() + if (IOS_XCODE_DSYM_FOLDER_FIX) + set_target_properties(network-extension PROPERTIES XCODE_ATTRIBUTE_CONFIGURATION_BUILD_DIR "$(inherited)") + endif() + add_dependencies(${APP_NAME} network-extension) # FIXME conflicts with XCTest bundle creation diff --git a/yass/README.md b/yass/README.md index 3f93a57767..0bb61c401e 100644 --- a/yass/README.md +++ b/yass/README.md @@ -14,8 +14,8 @@ yass is an efficient forward proxy client supporting http/socks4/socks4a/socks5/ Because we are reusing chromium's network stack directly, we are following [chromium's release schedule](https://chromiumdash.appspot.com/schedule) and delivering new versions based on its beta branch. -- [Latest M129's Release (1.13.x)](https://github.com/Chilledheart/yass/releases/tag/1.13.1) will become Stable since _Sep 17, 2024_. -- [Latest M128's Release (1.12.x)](https://github.com/Chilledheart/yass/releases/tag/1.12.3) has become Stable since _Aug 20, 2024_ (Extended Support). +- [Latest M129's Release (1.13.x)](https://github.com/Chilledheart/yass/releases/tag/1.13.2) will become Stable since _Sep 17, 2024_. +- [Latest M128's Release (1.12.x)](https://github.com/Chilledheart/yass/releases/tag/1.12.5) has become Stable since _Aug 20, 2024_ (Extended Support). - [Latest M127's Release (1.11.x)](https://github.com/Chilledheart/yass/releases/tag/1.11.5) has become Stable since _Jul 23, 2024_ - [Latest M126's Release (1.10.x)](https://github.com/Chilledheart/yass/releases/tag/1.10.7) has become Stable since _Jun 11, 2024_ (Extended Support) - [Latest M125's Release (1.9.x)](https://github.com/Chilledheart/yass/releases/tag/1.9.7) has become Stable since _May 14, 2024_ @@ -151,38 +151,38 @@ Please visit [the pages site](https://letshack.info). [KB2999226]: https://support.microsoft.com/en-us/topic/update-for-universal-c-runtime-in-windows-c0514201-7fe6-95a3-b0a5-287930f3560c [vs2010_x86]: https://download.microsoft.com/download/1/6/5/165255E7-1014-4D0A-B094-B6A430A6BFFC/vcredist_x86.exe -[gtk3_rpm_url]: https://github.com/Chilledheart/yass/releases/download/1.13.1/yass-gtk3.el8.x86_64.1.13.1.rpm -[gtk3_deb_url]: https://github.com/Chilledheart/yass/releases/download/1.13.1/yass-gtk3-ubuntu-16.04-xenial_amd64.1.13.1.deb -[qt5_rpm_url]: https://github.com/Chilledheart/yass/releases/download/1.13.1/yass-qt5.el8.x86_64.1.13.1.rpm -[qt5_deb_url]: https://github.com/Chilledheart/yass/releases/download/1.13.1/yass-qt5-ubuntu-16.04-xenial_amd64.1.13.1.deb -[gtk4_rpm_url]: https://github.com/Chilledheart/yass/releases/download/1.13.1/yass-gtk4.lp155.x86_64.1.13.1.rpm -[gtk4_deb_url]: https://github.com/Chilledheart/yass/releases/download/1.13.1/yass-gtk4-ubuntu-22.04-jammy_amd64.1.13.1.deb -[qt6_rpm_url]: https://github.com/Chilledheart/yass/releases/download/1.13.1/yass-qt6.lp155.x86_64.1.13.1.rpm -[qt6_deb_url]: https://github.com/Chilledheart/yass/releases/download/1.13.1/yass-qt6-ubuntu-22.04-jammy_amd64.1.13.1.deb +[gtk3_rpm_url]: https://github.com/Chilledheart/yass/releases/download/1.13.2/yass-gtk3.el8.x86_64.1.13.2.rpm +[gtk3_deb_url]: https://github.com/Chilledheart/yass/releases/download/1.13.2/yass-gtk3-ubuntu-16.04-xenial_amd64.1.13.2.deb +[qt5_rpm_url]: https://github.com/Chilledheart/yass/releases/download/1.13.2/yass-qt5.el8.x86_64.1.13.2.rpm +[qt5_deb_url]: https://github.com/Chilledheart/yass/releases/download/1.13.2/yass-qt5-ubuntu-16.04-xenial_amd64.1.13.2.deb +[gtk4_rpm_url]: https://github.com/Chilledheart/yass/releases/download/1.13.2/yass-gtk4.lp155.x86_64.1.13.2.rpm +[gtk4_deb_url]: https://github.com/Chilledheart/yass/releases/download/1.13.2/yass-gtk4-ubuntu-22.04-jammy_amd64.1.13.2.deb +[qt6_rpm_url]: https://github.com/Chilledheart/yass/releases/download/1.13.2/yass-qt6.lp155.x86_64.1.13.2.rpm +[qt6_deb_url]: https://github.com/Chilledheart/yass/releases/download/1.13.2/yass-qt6-ubuntu-22.04-jammy_amd64.1.13.2.deb -[qt5_flatpak_x86_64_url]: https://github.com/Chilledheart/yass/releases/download/1.13.1/yass-x86_64-1.13.1.flatpak -[gtk4_arch_url]: https://repo.archlinuxcn.org/x86_64/yass-proxy-1.13.1-1-x86_64.pkg.tar.zst +[qt5_flatpak_x86_64_url]: https://github.com/Chilledheart/yass/releases/download/1.13.2/yass-x86_64-1.13.2.flatpak +[gtk4_arch_url]: https://repo.archlinuxcn.org/x86_64/yass-proxy-1.13.2-1-x86_64.pkg.tar.zst -[cli_tgz_amd64_url]: https://github.com/Chilledheart/yass/releases/download/1.13.1/yass_cli-linux-release-amd64-1.13.1.tgz -[cli_tgz_i386_url]: https://github.com/Chilledheart/yass/releases/download/1.13.1/yass_cli-linux-release-amd64-1.13.1.tgz -[cli_tgz_arm64_url]: https://github.com/Chilledheart/yass/releases/download/1.13.1/yass_cli-linux-release-arm64-1.13.1.tgz -[cli_tgz_loongarch64_url]: https://github.com/Chilledheart/yass/releases/download/1.13.1/yass_cli-linux-release-loongarch64-1.13.1.tgz -[cli_tgz_riscv64_url]: https://github.com/Chilledheart/yass/releases/download/1.13.1/yass_cli-linux-release-riscv64-1.13.1.tgz -[cli_tgz_riscv32_url]: https://github.com/Chilledheart/yass/releases/download/1.13.1/yass_cli-linux-release-riscv32-1.13.1.tgz +[cli_tgz_amd64_url]: https://github.com/Chilledheart/yass/releases/download/1.13.2/yass_cli-linux-release-amd64-1.13.2.tgz +[cli_tgz_i386_url]: https://github.com/Chilledheart/yass/releases/download/1.13.2/yass_cli-linux-release-amd64-1.13.2.tgz +[cli_tgz_arm64_url]: https://github.com/Chilledheart/yass/releases/download/1.13.2/yass_cli-linux-release-arm64-1.13.2.tgz +[cli_tgz_loongarch64_url]: https://github.com/Chilledheart/yass/releases/download/1.13.2/yass_cli-linux-release-loongarch64-1.13.2.tgz +[cli_tgz_riscv64_url]: https://github.com/Chilledheart/yass/releases/download/1.13.2/yass_cli-linux-release-riscv64-1.13.2.tgz +[cli_tgz_riscv32_url]: https://github.com/Chilledheart/yass/releases/download/1.13.2/yass_cli-linux-release-riscv32-1.13.2.tgz -[cli_openwrt_amd64_url]: https://github.com/Chilledheart/yass/releases/download/1.13.1/yass_cli-linux-openwrt-release-x86_64-1.13.1.tgz -[cli_openwrt_i486_url]: https://github.com/Chilledheart/yass/releases/download/1.13.1/yass_cli-linux-openwrt-release-i486-1.13.1.tgz -[cli_openwrt_aarch64_url]: https://github.com/Chilledheart/yass/releases/download/1.13.1/yass_cli-linux-openwrt-release-aarch64-1.13.1.tgz +[cli_openwrt_amd64_url]: https://github.com/Chilledheart/yass/releases/download/1.13.2/yass_cli-linux-openwrt-release-x86_64-1.13.2.tgz +[cli_openwrt_i486_url]: https://github.com/Chilledheart/yass/releases/download/1.13.2/yass_cli-linux-openwrt-release-i486-1.13.2.tgz +[cli_openwrt_aarch64_url]: https://github.com/Chilledheart/yass/releases/download/1.13.2/yass_cli-linux-openwrt-release-aarch64-1.13.2.tgz -[cli_musl_amd64_url]: https://github.com/Chilledheart/yass/releases/download/1.13.1/yass_cli-linux-musl-release-amd64-1.13.1.tgz -[cli_musl_i386_url]: https://github.com/Chilledheart/yass/releases/download/1.13.1/yass_cli-linux-musl-release-i386-1.13.1.tgz +[cli_musl_amd64_url]: https://github.com/Chilledheart/yass/releases/download/1.13.2/yass_cli-linux-musl-release-amd64-1.13.2.tgz +[cli_musl_i386_url]: https://github.com/Chilledheart/yass/releases/download/1.13.2/yass_cli-linux-musl-release-i386-1.13.2.tgz -[android_64_apk_url]: https://github.com/Chilledheart/yass/releases/download/1.13.1/yass-android-release-arm64-1.13.1.apk -[android_32_apk_url]: https://github.com/Chilledheart/yass/releases/download/1.13.1/yass-android-release-arm-1.13.1.apk +[android_64_apk_url]: https://github.com/Chilledheart/yass/releases/download/1.13.2/yass-android-release-arm64-1.13.2.apk +[android_32_apk_url]: https://github.com/Chilledheart/yass/releases/download/1.13.2/yass-android-release-arm-1.13.2.apk -[windows_64_installer_url]: https://github.com/Chilledheart/yass/releases/download/1.13.1/yass-mingw-win7-release-x86_64-1.13.1-system-installer.exe -[windows_32_installer_url]: https://github.com/Chilledheart/yass/releases/download/1.13.1/yass-mingw-winxp-release-i686-1.13.1-system-installer.exe +[windows_64_installer_url]: https://github.com/Chilledheart/yass/releases/download/1.13.2/yass-mingw-win7-release-x86_64-1.13.2-system-installer.exe +[windows_32_installer_url]: https://github.com/Chilledheart/yass/releases/download/1.13.2/yass-mingw-winxp-release-i686-1.13.2-system-installer.exe -[windows_arm64_installer_url]: https://github.com/Chilledheart/yass/releases/download/1.13.1/yass-mingw-release-aarch64-1.13.1-system-installer.exe -[macos_intel_dmg_url]: https://github.com/Chilledheart/yass/releases/download/1.13.1/yass-macos-release-x64-1.13.1.dmg -[macos_arm_dmg_url]: https://github.com/Chilledheart/yass/releases/download/1.13.1/yass-macos-release-arm64-1.13.1.dmg +[windows_arm64_installer_url]: https://github.com/Chilledheart/yass/releases/download/1.13.2/yass-mingw-release-aarch64-1.13.2-system-installer.exe +[macos_intel_dmg_url]: https://github.com/Chilledheart/yass/releases/download/1.13.2/yass-macos-release-x64-1.13.2.dmg +[macos_arm_dmg_url]: https://github.com/Chilledheart/yass/releases/download/1.13.2/yass-macos-release-arm64-1.13.2.dmg diff --git a/yass/debian/changelog b/yass/debian/changelog index 365148284e..24d352cca3 100644 --- a/yass/debian/changelog +++ b/yass/debian/changelog @@ -1,3 +1,8 @@ +yass (1.13.2-1) UNRELEASED; urgency=medium + + * some trivial changes. + + -- Chilledheart Mon, 9 Sep 2024 08:58:40 +0800 yass (1.13.1-1) UNRELEASED; urgency=medium * ui: add tcp congestion algorithm in option dialog. diff --git a/yass/doc/yass_cli.1 b/yass/doc/yass_cli.1 index 990f868493..422c141726 100644 --- a/yass/doc/yass_cli.1 +++ b/yass/doc/yass_cli.1 @@ -1,6 +1,6 @@ .\" generated with Ronn-NG/v0.9.1 .\" http://github.com/apjanke/ronn-ng/tree/0.9.1 -.TH "YASS_CLI" "1" "July 2024" "" +.TH "YASS_CLI" "1" "September 2024" "" .SH "NAME" \fByass_cli\fR \- a lightweight and efficient, socks5/http forward proxy .SH "SYNOPSIS" @@ -16,6 +16,12 @@ See \fIhttps://github\.com/Chilledheart/yass/wiki/Usage\fR\. \fB\-c\fR \fIfile\fR, \fB\-\-configfile\fR \fIfile\fR Use specified \fIfile\fR as config file\. .TP +\fB\-t\fR +Don't run, just test the configuration file\. +.TP +\fB\-v\fR, \fB\-\-version\fR +Print yass_cli version\. +.TP \fB\-\-limit_rate\fR \fIrate\fR Limits the \fIrate\fR of response transmission to a client\. Uint can be \fB(none)\fR, \fBk\fR and \fBm\fR\. .TP diff --git a/yass/doc/yass_cli.md b/yass/doc/yass_cli.md index cbc1dcb5f7..5ddc813b0c 100644 --- a/yass/doc/yass_cli.md +++ b/yass/doc/yass_cli.md @@ -23,6 +23,12 @@ See . * `-c` _file_, `--configfile` _file_: Use specified _file_ as config file. +* `-t`: + Don't run, just test the configuration file. + +* `-v`, `--version`: + Print yass_cli version. + * `--limit_rate` _rate_: Limits the _rate_ of response transmission to a client. Uint can be `(none)`, `k` and `m`. diff --git a/yass/doc/yass_server.1 b/yass/doc/yass_server.1 index 6e0a7ed0b5..e9e83f8ec8 100644 --- a/yass/doc/yass_server.1 +++ b/yass/doc/yass_server.1 @@ -1,6 +1,6 @@ .\" generated with Ronn-NG/v0.9.1 .\" http://github.com/apjanke/ronn-ng/tree/0.9.1 -.TH "YASS_SEREVR" "1" "July 2024" "" +.TH "YASS_SEREVR" "1" "September 2024" "" .SH "NAME" \fByass_serevr\fR \- a lightweight and efficient, socks5/http forward proxy .SH "SYNOPSIS" @@ -16,6 +16,12 @@ See \fIhttps://github\.com/Chilledheart/yass/wiki/Usage\fR\. \fB\-c\fR \fIfile\fR, \fB\-\-configfile\fR \fIfile\fR Use specified \fIfile\fR as config file\. .TP +\fB\-t\fR +Don't run, just test the configuration file\. +.TP +\fB\-v\fR, \fB\-\-version\fR +Print yass_server version\. +.TP \fB\-\-limit_rate\fR \fIrate\fR Limits the \fIrate\fR of response transmission to a client\. Uint can be \fB(none)\fR, \fBk\fR and \fBm\fR\. .TP diff --git a/yass/doc/yass_server.md b/yass/doc/yass_server.md index 25b47de753..25b5553cc9 100644 --- a/yass/doc/yass_server.md +++ b/yass/doc/yass_server.md @@ -23,6 +23,12 @@ See . * `-c` _file_, `--configfile` _file_: Use specified _file_ as config file. +* `-t`: + Don't run, just test the configuration file. + +* `-v`, `--version`: + Print yass_server version. + * `--limit_rate` _rate_: Limits the _rate_ of response transmission to a client. Uint can be `(none)`, `k` and `m`. diff --git a/yass/src/cli/cli.cpp b/yass/src/cli/cli.cpp index 1edb56745f..fb5e36e307 100644 --- a/yass/src/cli/cli.cpp +++ b/yass/src/cli/cli.cpp @@ -109,6 +109,16 @@ int main(int argc, const char* argv[]) { config::SetClientUsageMessage(exec_path); config::ReadConfigFileAndArguments(argc, argv); + std::string err = config::ValidateConfig(); + if (!err.empty()) { + LOG(WARNING) << "Failed to validate config: " << err; + return -1; + } + if (config::testOnlyMode) { + LOG(WARNING) << "Configuration Validated"; + return 0; + } + #ifdef _WIN32 int iResult = 0; WSADATA wsaData = {0}; diff --git a/yass/src/config/config.cpp b/yass/src/config/config.cpp index 68d46df855..043766bdc6 100644 --- a/yass/src/config/config.cpp +++ b/yass/src/config/config.cpp @@ -160,6 +160,87 @@ bool SaveConfig() { return all_fields_written; } +std::string ValidateConfig() { + std::string err; + std::ostringstream err_msg; + + auto server_host = absl::GetFlag(FLAGS_server_host); + auto server_sni = absl::GetFlag(FLAGS_server_sni); + auto server_port = absl::GetFlag(FLAGS_server_port); + auto username = absl::GetFlag(FLAGS_username); + auto password = absl::GetFlag(FLAGS_password); + auto method = absl::GetFlag(FLAGS_method); + auto local_host = absl::GetFlag(FLAGS_local_host); + // auto local_port = absl::GetFlag(FLAGS_local_port); + auto doh_url = absl::GetFlag(FLAGS_doh_url); + auto dot_host = absl::GetFlag(FLAGS_dot_host); + // auto limit_rate = absl::GetFlag(FLAGS_limit_rate); + // auto timeout = absl::GetFlag(FLAGS_connect_timeout); + + // TODO validate other configurations as well + + if (server_host.empty() || server_host.size() >= TLSEXT_MAXLEN_host_name) { + err_msg << ",Invalid Server Host: " << server_host; + } + + if (server_sni.size() >= TLSEXT_MAXLEN_host_name) { + err_msg << ",Invalid Server Host: " << server_sni; + } + + if (server_port.port == 0) { + err_msg << ",Invalid Server Port: " << server_port.port; + } + + if (method == CRYPTO_INVALID) { + err_msg << ",Invalid Cipher: " << to_cipher_method_str(method); + } + + if (method == CRYPTO_SOCKS4 || method == CRYPTO_SOCKS4A) { + if (!username.empty() || !password.empty()) { + err_msg << ",SOCKS4/SOCKSA doesn't support username and passsword"; + } + } + + if (method == CRYPTO_SOCKS5 || method == CRYPTO_SOCKS5H) { + if (username.empty() ^ password.empty()) { + err_msg << ",SOCKS5/SOCKS5H requires both of username and passsword"; + } + } + + if (CIPHER_METHOD_IS_HTTP(method)) { + if (username.empty() ^ password.empty()) { + err_msg << ",HTTP requires both of username and passsword"; + } + } + + if (local_host.empty() || local_host.size() >= TLSEXT_MAXLEN_host_name) { + err_msg << ",Invalid Local Host: " << local_host; + } + + if (!doh_url.empty()) { + GURL url(doh_url); + if (!url.is_valid() || !url.has_host() || !url.has_scheme() || url.scheme() != "https") { + err_msg << ",Invalid DoH URL: " << doh_url; + } + if (!dot_host.empty()) { + err_msg << ",Conflicting DoT Host: " << dot_host; + } + } + + if (!dot_host.empty()) { + if (dot_host.size() >= TLSEXT_MAXLEN_host_name) { + err_msg << ",Invalid DoT Host: " << dot_host; + } + } + + auto ret = err_msg.str(); + if (ret.empty()) { + return ret; + } else { + return ret.substr(1); + } +} + std::string ReadConfigFromArgument(std::string_view server_host, std::string_view server_sni, std::string_view _server_port, @@ -184,7 +265,7 @@ std::string ReadConfigFromArgument(std::string_view server_host, } PortFlag server_port; - if (!AbslParseFlag(_server_port, &server_port, &err)) { + if (!AbslParseFlag(_server_port, &server_port, &err) || server_port.port == 0u) { err_msg << ",Invalid Server Port: " << _server_port; } @@ -289,7 +370,7 @@ std::string ReadConfigFromArgument(std::string_view server_host, } PortFlag server_port; - if (!AbslParseFlag(_server_port, &server_port, &err)) { + if (!AbslParseFlag(_server_port, &server_port, &err) || server_port.port == 0u) { err_msg << ",Invalid Server Port: " << _server_port; } @@ -374,6 +455,8 @@ std::string ReadConfigFromArgument(std::string_view server_host, void SetClientUsageMessage(std::string_view exec_path) { absl::SetProgramUsageMessage(absl::StrCat("Usage: ", Basename(exec_path), " [options ...]\n", R"( -K, --config Read config from a file + -t Don't run, just test the configuration file + -v, --version Print yass version --server_host Remote server on given host --server_port Remote server on given port --local_host Local proxy server on given host @@ -396,6 +479,8 @@ void SetClientUsageMessage(std::string_view exec_path) { void SetServerUsageMessage(std::string_view exec_path) { absl::SetProgramUsageMessage(absl::StrCat("Usage: ", Basename(exec_path), " [options ...]\n", R"( -K, --config Read config from a file + -t Don't run, just test the configuration file + -v, --version Print yass version --server_host Server on given host --server_port Server on given port --username Server user diff --git a/yass/src/config/config.hpp b/yass/src/config/config.hpp index a729f9e09d..035f0ec836 100644 --- a/yass/src/config/config.hpp +++ b/yass/src/config/config.hpp @@ -34,8 +34,11 @@ enum ProgramType { extern const ProgramType pType; const char* ProgramTypeToStr(ProgramType type); +extern bool testOnlyMode; void ReadConfigFileAndArguments(int argc, const char** argv); +std::string ValidateConfig(); + std::string ReadConfigFromArgument(std::string_view server_host, std::string_view server_sni, std::string_view server_port, diff --git a/yass/src/config/config_version.cpp b/yass/src/config/config_version.cpp index 2073ea6a7a..a748774014 100644 --- a/yass/src/config/config_version.cpp +++ b/yass/src/config/config_version.cpp @@ -25,6 +25,8 @@ namespace config { +bool testOnlyMode = false; + static void ParseConfigFileOption(int argc, const char** argv) { int pos = 1; while (pos < argc) { @@ -63,16 +65,20 @@ static void ParseConfigFileOption(int argc, const char** argv) { argv[pos + 1] = ""; pos += 2; continue; + } else if (arg == "-t") { + testOnlyMode = true; + argv[pos] = ""; + pos += 1; } else if (arg == "-version" || arg == "--version") { std::cout << absl::flags_internal::ShortProgramInvocationName() << " " << YASS_APP_TAG << " type: " << ProgramTypeToStr(pType) << std::endl; std::cout << "Last Change: " << YASS_APP_LAST_CHANGE << std::endl; std::cout << "Features: " << YASS_APP_FEATURES << std::endl; #ifdef HAVE_TCMALLOC - std::cerr << "TCMALLOC: " << tc_version(nullptr, nullptr, nullptr) << std::endl; + std::cout << "TCMALLOC: " << tc_version(nullptr, nullptr, nullptr) << std::endl; #endif #ifdef HAVE_MIMALLOC - std::cerr << "MIMALLOC: " << mi_version() << std::endl; + std::cout << "MIMALLOC: " << mi_version() << std::endl; #endif #ifndef NDEBUG std::cout << "Debug build (NDEBUG not #defined)" << std::endl; diff --git a/yass/src/gtk/yass.cpp b/yass/src/gtk/yass.cpp index 4aa51d58d9..fd0741747b 100644 --- a/yass/src/gtk/yass.cpp +++ b/yass/src/gtk/yass.cpp @@ -80,6 +80,15 @@ int main(int argc, const char** argv) { config::SetClientUsageMessage(exec_path); config::ReadConfigFileAndArguments(argc, argv); + std::string err = config::ValidateConfig(); + if (!err.empty()) { + LOG(WARNING) << "Failed to validate config: " << err; + } + if (config::testOnlyMode) { + LOG(WARNING) << "Configuration Validated"; + return 0; + } + #if !GLIB_CHECK_VERSION(2, 35, 0) // GLib type system initialization. It's unclear if it's still required for // any remaining code. Most likely this is superfluous as gtk_init() ought diff --git a/yass/src/gtk4/yass.cpp b/yass/src/gtk4/yass.cpp index b55fa62cf3..922354be12 100644 --- a/yass/src/gtk4/yass.cpp +++ b/yass/src/gtk4/yass.cpp @@ -143,6 +143,15 @@ int main(int argc, const char** argv) { config::SetClientUsageMessage(exec_path); config::ReadConfigFileAndArguments(argc, argv); + std::string err = config::ValidateConfig(); + if (!err.empty()) { + LOG(WARNING) << "Failed to validate config: " << err; + } + if (config::testOnlyMode) { + LOG(WARNING) << "Configuration Validated"; + return 0; + } + #if !GLIB_CHECK_VERSION(2, 35, 0) // GLib type system initialization. It's unclear if it's still required for // any remaining code. Most likely this is superfluous as gtk_init() ought diff --git a/yass/src/mac/main.mm b/yass/src/mac/main.mm index 11c8e33bee..ed35c371e4 100644 --- a/yass/src/mac/main.mm +++ b/yass/src/mac/main.mm @@ -84,5 +84,14 @@ int main(int argc, const char** argv) { config::SetClientUsageMessage(exec_path); config::ReadConfigFileAndArguments(argc, argv); + std::string err = config::ValidateConfig(); + if (!err.empty()) { + LOG(WARNING) << "Failed to validate config: " << err; + } + if (config::testOnlyMode) { + LOG(WARNING) << "Configuration Validated"; + return 0; + } + return NSApplicationMain(argc, argv); } diff --git a/yass/src/qt6/yass.cpp b/yass/src/qt6/yass.cpp index 6225768f1c..99e3e9b68b 100644 --- a/yass/src/qt6/yass.cpp +++ b/yass/src/qt6/yass.cpp @@ -93,6 +93,15 @@ int main(int argc, const char** argv) { config::SetClientUsageMessage(exec_path); config::ReadConfigFileAndArguments(argc, argv); + std::string err = config::ValidateConfig(); + if (!err.empty()) { + LOG(WARNING) << "Failed to validate config: " << err; + } + if (config::testOnlyMode) { + LOG(WARNING) << "Configuration Validated"; + return 0; + } + YASSApp program(argc, const_cast(argv)); // call program init diff --git a/yass/src/server/server.cpp b/yass/src/server/server.cpp index 9d7fd3c4db..b3bf0e35d2 100644 --- a/yass/src/server/server.cpp +++ b/yass/src/server/server.cpp @@ -87,6 +87,16 @@ int main(int argc, const char* argv[]) { config::SetServerUsageMessage(exec_path); config::ReadConfigFileAndArguments(argc, argv); + std::string err = config::ValidateConfig(); + if (!err.empty()) { + LOG(WARNING) << "Failed to validate config: " << err; + return -1; + } + if (config::testOnlyMode) { + LOG(WARNING) << "Configuration Validated"; + return 0; + } + #ifdef _WIN32 int iResult = 0; WSADATA wsaData = {0}; diff --git a/yass/src/win32/yass.cpp b/yass/src/win32/yass.cpp index a88dc3c97f..d1b2c724cb 100644 --- a/yass/src/win32/yass.cpp +++ b/yass/src/win32/yass.cpp @@ -102,6 +102,15 @@ int APIENTRY wWinMain(_In_ HINSTANCE hInstance, config::SetClientUsageMessage(exec_path); config::ReadConfigFileAndArguments(argc, &argv[0]); + std::string err = config::ValidateConfig(); + if (!err.empty()) { + LOG(WARNING) << "Failed to validate config: " << err; + } + if (config::testOnlyMode) { + LOG(WARNING) << "Configuration Validated"; + return 0; + } + int iResult = 0; WSADATA wsaData = {0}; iResult = WSAStartup(MAKEWORD(2, 2), &wsaData); diff --git a/yass/src/win32/yass_frame.cpp b/yass/src/win32/yass_frame.cpp index 8455204370..ac2475b277 100644 --- a/yass/src/win32/yass_frame.cpp +++ b/yass/src/win32/yass_frame.cpp @@ -159,10 +159,11 @@ HWND CreateStatic(const wchar_t* label, HWND pParentWnd, UINT nID, HINSTANCE hIn } HWND CreateEdit(DWORD dwStyle, HWND pParentWnd, UINT nID, HINSTANCE hInstance) { - return CreateWindowExW(0, WC_EDITW, nullptr, - WS_TABSTOP | WS_CHILD | WS_VISIBLE | WS_BORDER | WS_BORDER | ES_LEFT | dwStyle, CW_USEDEFAULT, - CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, pParentWnd, - reinterpret_cast(static_cast(nID)), hInstance, nullptr); + return CreateWindowExW( + 0, WC_EDITW, nullptr, + WS_TABSTOP | WS_CHILD | WS_VISIBLE | WS_BORDER | WS_BORDER | ES_LEFT | ES_AUTOHSCROLL | dwStyle, CW_USEDEFAULT, + CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, pParentWnd, reinterpret_cast(static_cast(nID)), + hInstance, nullptr); } HWND CreateComboBox(DWORD dwStyle, HWND pParentWnd, UINT nID, HINSTANCE hInstance) { diff --git a/yass/tools/build.go b/yass/tools/build.go index 2e6d25a551..7c1a990dc6 100644 --- a/yass/tools/build.go +++ b/yass/tools/build.go @@ -992,6 +992,8 @@ func buildStageGenerateBuildScript() { cmakeArgs = append(cmakeArgs, fmt.Sprintf("-DCMAKE_TOOLCHAIN_FILE=%s/../cmake/platforms/ios.toolchain.cmake", buildDir)) cmakeArgs = append(cmakeArgs, fmt.Sprintf("-DDEPLOYMENT_TARGET=%s", iosVersionMinFlag)) platform := "OS" + glog.Warning("No Packaging supported for ios, disabling...") + noPackagingFlag = true if subSystemNameFlag == "simulator" { if archFlag == "x86" { platform = "SIMULATOR" @@ -1004,8 +1006,6 @@ func buildStageGenerateBuildScript() { } cmakeArgs = append(cmakeArgs, fmt.Sprintf("-DXCODE_CODESIGN_IDENTITY=%s", iosCodeSignIdentityFlag)) cmakeArgs = append(cmakeArgs, fmt.Sprintf("-DXCODE_DEPLOYMENT_TEAM=%s", iosDevelopmentTeamFlag)) - glog.Info("No Packaging supported for simulator, disabling...") - noPackagingFlag = true } else if subSystemNameFlag != "" { glog.Fatalf("Invalid subSystemNameFlag: %s", subSystemNameFlag) } else { @@ -1018,6 +1018,7 @@ func buildStageGenerateBuildScript() { } cmakeArgs = append(cmakeArgs, fmt.Sprintf("-DXCODE_CODESIGN_IDENTITY=%s", iosCodeSignIdentityFlag)) cmakeArgs = append(cmakeArgs, fmt.Sprintf("-DXCODE_DEPLOYMENT_TEAM=%s", iosDevelopmentTeamFlag)) + cmakeArgs = append(cmakeArgs, "-DIOS_XCODE_DSYM_FOLDER_FIX=on") } cmakeArgs = append(cmakeArgs, fmt.Sprintf("-DPLATFORM=%s", platform)) @@ -1970,6 +1971,20 @@ func archiveMainFile(output string, prefix string, paths []string, dllPaths []st "-jobs", fmt.Sprintf("%d", cmakeBuildConcurrencyFlag), "-target", APPNAME, "-scheme", APPNAME}, true) + // + // copy dSYMs to xcarchive + // + xcarchiveSubdir := cmakeBuildTypeFlag + ".xcarchive" + cmdRun([]string{"rm", "-rf", filepath.Join(xcarchiveSubdir, "dSYMs", getAppName()+".dSYM")}, true) + cmdRun([]string{"rm", "-rf", filepath.Join(xcarchiveSubdir, "dSYMs", "YassPacketTunnel.appex.dSYM")}, true) + + buildSubdir := cmakeBuildTypeFlag + "-iphoneos" + if subSystemNameFlag == "simulator" { + buildSubdir = cmakeBuildTypeFlag + "-iphonesimulator" + } + cmdRun([]string{"ditto", "-v", filepath.Join(buildSubdir, getAppName()+".dSYM"), filepath.Join(xcarchiveSubdir, "dSYMs", getAppName()+".dSYM")}, true) + cmdRun([]string{"ditto", "-v", filepath.Join(buildSubdir, "YassPacketTunnel.appex.dSYM"), filepath.Join(xcarchiveSubdir, "dSYMs", "YassPacketTunnel.appex.dSYM")}, true) + cmdRun([]string{"xcodebuild", "-exportArchive", "-archivePath", cmakeBuildTypeFlag + ".xcarchive", "-exportPath", ".", @@ -1978,12 +1993,9 @@ func archiveMainFile(output string, prefix string, paths []string, dllPaths []st if err != nil { glog.Fatalf("%v", err) } + // // cleanup after exportArchive // - buildSubdir := cmakeBuildTypeFlag + "-iphoneos" - if subSystemNameFlag == "simulator" { - buildSubdir = cmakeBuildTypeFlag + "-iphonesimulator" - } err = os.Chdir(buildSubdir) if err != nil { glog.Fatalf("%v", err) @@ -2301,19 +2313,19 @@ func postStateArchives() map[string][]string { } archiveFiles(debugArchive, archivePrefix, dbgPaths) } else if systemNameFlag == "mingw" || systemNameFlag == "harmony" || systemNameFlag == "linux" || systemNameFlag == "freebsd" { - dbgPaths = append(dbgPaths, getAppName() + ".dbg") + dbgPaths = append(dbgPaths, getAppName()+".dbg") if hasCrashpadDbg { dbgPaths = append(dbgPaths, "crashpad_handler.dbg") } archiveFiles(debugArchive, archivePrefix, dbgPaths) } else if systemNameFlag == "android" { - dbgPaths = append(dbgPaths, getAppName() + ".dbg") + dbgPaths = append(dbgPaths, getAppName()+".dbg") if hasCrashpadDbg { dbgPaths = append(dbgPaths, "crashpad_handler.dbg") } archiveFiles(debugArchive, archivePrefix, dbgPaths) } else if systemNameFlag == "darwin" { - dbgPaths = append(dbgPaths, getAppName() + ".dSYM") + dbgPaths = append(dbgPaths, getAppName()+".dSYM") if hasCrashpadDbg { dbgPaths = append(dbgPaths, "crashpad_handler.dbg") } @@ -2326,8 +2338,8 @@ func postStateArchives() map[string][]string { } cmdRun([]string{"rm", "-rf", getAppName() + ".dSYM"}, true) cmdRun([]string{"rm", "-rf", "YassPacketTunnel.appex.dSYM"}, true) - cmdRun([]string{"cp", "-r", filepath.Join(buildSubdir, getAppName()+".dSYM"), getAppName() + ".dSYM"}, true) - cmdRun([]string{"cp", "-r", filepath.Join(buildSubdir, "YassPacketTunnel.appex.dSYM"), "YassPacketTunnel.appex.dSYM"}, true) + cmdRun([]string{"ditto", "-v", filepath.Join(buildSubdir, getAppName()+".dSYM"), getAppName() + ".dSYM"}, true) + cmdRun([]string{"ditto", "-v", filepath.Join(buildSubdir, "YassPacketTunnel.appex.dSYM"), "YassPacketTunnel.appex.dSYM"}, true) archiveFiles(debugArchive, archivePrefix, []string{getAppName() + ".dSYM", "YassPacketTunnel.appex.dSYM"}) dbgPaths = append(dbgPaths, getAppName()+".dSYM", "YassPacketTunnel.appex.dSYM") } diff --git a/yass/yass.spec.in b/yass/yass.spec.in index e0b2ebb7ec..dfa2039dc6 100644 --- a/yass/yass.spec.in +++ b/yass/yass.spec.in @@ -318,6 +318,8 @@ for embedded devices and low end boxes. %systemd_postun_with_restart yass-redir.service %changelog +* Mon Sep 9 2024 Chilledheart - 1.13.2-1 + - some trivial changes * Sun Sep 1 2024 Chilledheart - 1.13.1-1 - ui: add tcp congestion algorithm in option dialog - qt: update windows title and shortcuts in menu