Compare commits

52 Commits

Author SHA1 Message Date
0090b6bd84 Update README.md
Some checks failed
Build / check-version (push) Successful in 5s
Build / build-windows (push) Successful in 8m1s
Build / build-linux (push) Successful in 18m11s
Build / create-release (push) Has been cancelled
Build / build-android (push) Has been cancelled
2026-02-05 02:28:50 +10:00
7296b0cd34 Refactor code structure for improved readability and maintainability
Some checks failed
Build / build-windows (push) Failing after 2m33s
Build / check-version (push) Successful in 9s
Build / create-release (push) Has been cancelled
Build / build-android (push) Has been cancelled
Build / build-linux (push) Has been cancelled
2026-02-05 03:24:42 +11:00
7a5e258f23 refactor: update permission sets and schemas for opener functionality
Some checks failed
Build / build-windows (push) Successful in 18m42s
Build / check-version (push) Has been cancelled
Build / build-linux (push) Has been cancelled
Build / create-release (push) Has been cancelled
Build / build-android (push) Has been cancelled
- Changed permission descriptions and constants in android-schema.json and mobile-schema.json to reflect new opener functionality.
- Updated capabilities.json to remove deprecated shell permissions and include new opener permissions.
- Refactored schema definitions to align with the new opener API, including changes to allowed and denied commands.
- Adjusted application references in schemas to clarify usage with URLs and paths.
2026-01-29 23:19:50 +11:00
3ccae09dca fix: update mobile capabilities to replace opener permission with shell:allow-open
Some checks failed
Build / check-version (push) Successful in 6s
Build / build-linux (push) Successful in 6m5s
Build / build-windows (push) Successful in 13m39s
Build / build-android (push) Failing after 11m54s
Build / create-release (push) Has been skipped
2026-01-25 22:41:52 +11:00
90407c49c6 feat: add open_external_url command to open URLs in the default browser
All checks were successful
Build / check-version (push) Successful in 6s
Build / build-windows (push) Successful in 6m12s
Build / build-linux (push) Successful in 9m27s
Build / build-android (push) Successful in 26m23s
Build / create-release (push) Has been skipped
2026-01-25 21:50:17 +11:00
61c1e3857d fix: update window capabilities to allow all windows and enhance opener permissions
Some checks failed
Build / check-version (push) Successful in 6s
Build / build-linux (push) Successful in 6m7s
Build / build-windows (push) Successful in 7m45s
Build / create-release (push) Has been cancelled
Build / build-android (push) Has been cancelled
2026-01-25 21:38:44 +11:00
6cc8d06e18 fix: restrict window capability to 'main' and enhance opener permissions
Some checks failed
Build / check-version (push) Successful in 5s
Build / build-linux (push) Successful in 6m51s
Build / build-windows (push) Successful in 12m10s
Build / create-release (push) Has been cancelled
Build / build-android (push) Has been cancelled
2026-01-25 21:16:12 +11:00
27a7e61ff8 fix: update opener permissions to allow default URLs and remove unnecessary entries
Some checks failed
Build / check-version (push) Successful in 6s
Build / build-linux (push) Successful in 5m43s
Build / build-windows (push) Successful in 7m46s
Build / create-release (push) Has been cancelled
Build / build-android (push) Has been cancelled
2026-01-25 21:06:46 +11:00
72af2b3ef7 fix: update Android build command to target aarch64 architecture and enhance opener permissions
Some checks failed
Build / check-version (push) Successful in 6s
Build / build-linux (push) Successful in 6m11s
Build / build-windows (push) Successful in 7m49s
Build / build-android (push) Has started running
Build / create-release (push) Has been cancelled
2026-01-25 20:53:12 +11:00
c612dfa824 fix: update capabilities for mobile and desktop, enhance window configuration
Some checks failed
Build / check-version (push) Successful in 6s
Build / build-linux (push) Successful in 6m1s
Build / build-windows (push) Successful in 6m15s
Build / create-release (push) Has been cancelled
Build / build-android (push) Has been cancelled
2026-01-25 20:09:08 +11:00
ca049e53f5 chore: update cinny submodule with link click debugging
Some checks failed
Build / check-version (push) Successful in 6s
Build / build-linux (push) Successful in 6m13s
Build / build-windows (push) Successful in 15m34s
Build / create-release (push) Has been cancelled
Build / build-android (push) Has been cancelled
2026-01-25 19:49:49 +11:00
5a3cbd02e6 Update README.md
Some checks failed
Build / check-version (push) Successful in 6s
Build / build-linux (push) Successful in 5m46s
Build / build-windows (push) Successful in 13m28s
Build / create-release (push) Has been cancelled
Build / build-android (push) Has been cancelled
2026-01-25 18:34:03 +10:00
02bc4caaaf chore: update cinny submodule with opener fix
Some checks failed
Build / check-version (push) Successful in 6s
Build / build-linux (push) Successful in 6m1s
Build / build-windows (push) Successful in 12m49s
Build / create-release (push) Has been cancelled
Build / build-android (push) Has been cancelled
2026-01-25 18:40:32 +11:00
72b9a1480c fix: remove duplicate mobile_entry_point macro
Some checks failed
Build / check-version (push) Successful in 4s
Build / build-android (push) Has been cancelled
Build / create-release (push) Has been cancelled
Build / build-linux (push) Has been cancelled
Build / build-windows (push) Has been cancelled
2026-01-25 17:53:11 +11:00
ca56725984 fix: separate capabilities for desktop (autostart) and mobile
Some checks failed
Build / check-version (push) Successful in 7s
Build / build-linux (push) Successful in 6m0s
Build / build-windows (push) Successful in 10m28s
Build / build-android (push) Failing after 7m53s
Build / create-release (push) Has been skipped
2026-01-25 14:59:34 +11:00
e4d8f6152e perf: limit Android build to arm64-v8a only (99%+ of devices)
Some checks failed
Build / check-version (push) Successful in 6s
Build / build-linux (push) Successful in 6m8s
Build / build-windows (push) Successful in 11m41s
Build / build-android (push) Failing after 7m51s
Build / create-release (push) Has been skipped
2026-01-25 14:33:11 +11:00
a191fb0609 chore: remove unused GitHub Actions workflow
Some checks failed
Build / check-version (push) Successful in 10s
Build / build-windows (push) Successful in 6m53s
Build / create-release (push) Has been cancelled
Build / build-android (push) Has been cancelled
Build / build-linux (push) Has been cancelled
2026-01-25 14:21:08 +11:00
b7031f85e0 feat: add MSI updater files (.msi.zip, .msi.zip.sig) to CI workflow
Some checks failed
Build / check-version (push) Successful in 7s
Build / build-windows (push) Has been cancelled
Build / build-android (push) Has been cancelled
Build / create-release (push) Has been cancelled
Build / build-linux (push) Has been cancelled
2026-01-25 14:20:01 +11:00
0e6d140d01 fix: add xdg-utils and patchelf to Linux CI dependencies
Some checks failed
Build / check-version (push) Successful in 4s
Build / build-windows (push) Has been cancelled
Build / build-android (push) Has been cancelled
Build / create-release (push) Has been cancelled
Build / build-linux (push) Has been cancelled
2026-01-25 14:16:53 +11:00
2d0398f5d3 fix: update tauri script to use Node.js for file copying
Some checks failed
Build / check-version (push) Successful in 4s
Build / build-linux (push) Failing after 4m21s
Build / build-android (push) Has been cancelled
Build / create-release (push) Has been cancelled
Build / build-windows (push) Has been cancelled
2026-01-25 14:09:54 +11:00
b6c07916af chore: update subproject commit reference
Some checks failed
Build / check-version (push) Successful in 4s
Build / build-linux (push) Failing after 4m32s
Build / build-android (push) Has been cancelled
Build / create-release (push) Has been cancelled
Build / build-windows (push) Has been cancelled
2026-01-25 14:02:30 +11:00
37141d3d31 Merge branch 'main' of http://synbox.ruv.wtf:8418/litruv/cinny-desktop
Some checks failed
Build / check-version (push) Successful in 4s
Build / build-windows (push) Failing after 1m56s
Build / create-release (push) Has been cancelled
Build / build-linux (push) Has been cancelled
Build / build-android (push) Has been cancelled
2026-01-25 13:59:00 +11:00
58626aa942 refactor: update permission identifiers and descriptions in windows-schema.json
- Changed permission identifiers from `shell` to `opener` for clarity.
- Updated descriptions to reflect new functionality for opening URLs and revealing items in directories.
- Removed deprecated permissions and added new autostart permissions in the schema.
- Adjusted the structure of allowed and denied entries for better organization.

feat: implement system tray functionality in lib.rs

- Added system tray support with show and quit options.
- Implemented event handling for tray icon clicks and menu interactions.
- Modified application run logic to minimize to tray on window close.
- Updated plugins to use `tauri_plugin_opener` instead of `tauri_plugin_shell`.
2026-01-25 13:58:58 +11:00
d4264f0e8d Update README.md
All checks were successful
Build / check-version (push) Successful in 5s
Build / build-linux (push) Successful in 5m43s
Build / build-windows (push) Successful in 13m22s
Build / build-android (push) Successful in 34m12s
Build / create-release (push) Has been skipped
2026-01-25 11:29:37 +10:00
90fc67c805 Merge branch 'main' of http://synbox.ruv.wtf:8418/litruv/cinny-desktop
Some checks failed
Build / check-version (push) Successful in 4s
Build / build-linux (push) Successful in 10m38s
Build / build-windows (push) Successful in 12m19s
Build / create-release (push) Has been cancelled
Build / build-android (push) Has been cancelled
2026-01-25 11:32:03 +11:00
6cabc01f77 feat: update capabilities and add clipboard image reading functionality for Linux
- Updated capabilities.json to allow opening shell commands.
- Implemented read_clipboard_image function for Linux using arboard to read images from the clipboard and encode them as base64 PNG.
- Added a stub for read_clipboard_image on non-Linux platforms.
- Registered the new command in the Tauri application.
2026-01-25 11:31:54 +11:00
d2619004b5 Update README.md
All checks were successful
Build / check-version (push) Successful in 4s
Build / build-linux (push) Successful in 5m40s
Build / build-windows (push) Successful in 6m28s
Build / build-android (push) Successful in 13m6s
Build / create-release (push) Has been skipped
2026-01-25 04:45:46 +10:00
eaa8e3949a Refactor code structure for improved readability and maintainability
Some checks failed
Build / check-version (push) Successful in 5s
Build / build-linux (push) Successful in 5m34s
Build / build-windows (push) Successful in 6m35s
Build / create-release (push) Has been cancelled
Build / build-android (push) Has been cancelled
2026-01-25 04:20:38 +11:00
6a32c023ee Refactor code structure for improved readability and maintainability
Some checks failed
Build / check-version (push) Successful in 4s
Build / build-linux (push) Successful in 13m23s
Build / build-windows (push) Successful in 14m23s
Build / create-release (push) Has been cancelled
Build / build-android (push) Has been cancelled
2026-01-25 03:10:17 +11:00
773c036404 fix: update package name to 'paarrot' and add png2icons dependency
Some checks failed
Build / check-version (push) Successful in 4s
Build / build-linux (push) Successful in 12m53s
Build / build-windows (push) Successful in 19m1s
Build / create-release (push) Has been cancelled
Build / build-android (push) Has been cancelled
2026-01-25 01:50:31 +11:00
2a8c3a1475 Refactor code structure for improved readability and maintainability
Some checks failed
Build / check-version (push) Successful in 5s
Build / build-linux (push) Successful in 12m45s
Build / build-windows (push) Failing after 15m39s
Build / create-release (push) Has been cancelled
Build / build-android (push) Has been cancelled
2026-01-25 01:09:30 +11:00
a749db75f7 fix: mark subproject as dirty in cinny
Some checks failed
Build / check-version (push) Successful in 5s
Build / build-linux (push) Successful in 9m39s
Build / build-windows (push) Successful in 23m30s
Build / create-release (push) Has been cancelled
Build / build-android (push) Has been cancelled
2026-01-25 00:40:46 +11:00
d16a55e06d fix: add caching for Cargo registry and build artifacts in Tauri workflow
Some checks failed
Build / check-version (push) Successful in 4s
Build / build-windows (push) Has been cancelled
Build / build-android (push) Has been cancelled
Build / build-linux (push) Has been cancelled
Build / create-release (push) Has been cancelled
2026-01-25 00:31:54 +11:00
93085b7029 feat: add Rust linker configuration for multiple targets
Some checks failed
Build / check-version (push) Successful in 4s
Build / build-linux (push) Successful in 9m24s
Build / build-windows (push) Successful in 13m28s
Build / create-release (push) Has been cancelled
Build / build-android (push) Has been cancelled
2026-01-25 00:14:11 +11:00
fce3c8ea59 fix: optimize build performance by adjusting Rust compilation settings
Some checks failed
Build / check-version (push) Successful in 5s
Build / build-linux (push) Successful in 6m13s
Build / build-windows (push) Successful in 17m18s
Build / create-release (push) Has been cancelled
Build / build-android (push) Has been cancelled
2026-01-24 23:54:46 +11:00
d73a6874f6 feat: add Android ARM64 build support in Tauri workflow
Some checks failed
Build / check-version (push) Successful in 4s
Build / build-linux (push) Successful in 5m10s
Build / build-windows (push) Successful in 12m0s
Build / build-android (push) Has started running
Build / create-release (push) Has been cancelled
2026-01-24 23:31:16 +11:00
8531cfdbf6 fix: update schema reference in default capabilities and remove unused desktop capabilities file
All checks were successful
Build / check-version (push) Successful in 3s
Build / build-windows (push) Successful in 11m28s
Build / build-linux (push) Successful in 12m18s
Build / build-android (push) Successful in 26m24s
Build / create-release (push) Successful in 14s
2026-01-24 08:30:45 +11:00
430f37a8a4 fix: update identifier in desktop capabilities configuration
Some checks failed
Build / check-version (push) Successful in 5s
Build / build-linux (push) Failing after 3m16s
Build / build-android (push) Has been cancelled
Build / create-release (push) Has been cancelled
Build / build-windows (push) Has been cancelled
2026-01-24 08:26:14 +11:00
1c4165b536 fix: update cinny subproject commit reference
Some checks failed
Build / check-version (push) Successful in 4s
Build / build-linux (push) Failing after 3m18s
Build / build-android (push) Has been cancelled
Build / create-release (push) Has been cancelled
Build / build-windows (push) Has been cancelled
2026-01-24 08:21:42 +11:00
6f987b6be3 fix: mark cinny subproject as dirty
Some checks failed
Build / check-version (push) Successful in 4s
Build / build-linux (push) Failing after 1m53s
Build / build-windows (push) Failing after 1m58s
Build / create-release (push) Has been cancelled
Build / build-android (push) Has been cancelled
2026-01-24 08:18:48 +11:00
1264065aeb fix: update cinny subproject commit reference
Some checks failed
Build / check-version (push) Successful in 4s
Build / build-linux (push) Failing after 2m3s
Build / build-windows (push) Failing after 2m3s
Build / create-release (push) Has been cancelled
Build / build-android (push) Has been cancelled
2026-01-24 08:15:55 +11:00
058d55af7b fix: mark cinny subproject as dirty
Some checks failed
Build / check-version (push) Successful in 5s
Build / build-linux (push) Failing after 1m58s
Build / build-windows (push) Failing after 2m4s
Build / build-android (push) Has started running
Build / create-release (push) Has been cancelled
2026-01-24 08:12:41 +11:00
a7156f1a76 bump version to 4.10.8 in tauri configuration
Some checks failed
Build / check-version (push) Successful in 6s
Build / build-windows (push) Failing after 1m58s
Build / build-linux (push) Failing after 1m54s
Build / create-release (push) Has been cancelled
Build / build-android (push) Has been cancelled
2026-01-24 08:09:19 +11:00
94b72d0fe8 bump version to 4.10.7 in tauri configuration
Some checks failed
Build / check-version (push) Successful in 4s
Build / build-linux (push) Failing after 1m59s
Build / build-windows (push) Failing after 2m2s
Build / build-android (push) Failing after 2m13s
Build / create-release (push) Has been skipped
2026-01-24 08:04:29 +11:00
3198e496c4 feat: add desktop capability schema with default permissions
Some checks failed
Build / check-version (push) Successful in 4s
Build / build-linux (push) Failing after 2m2s
Build / build-windows (push) Failing after 1m43s
Build / create-release (push) Has been cancelled
Build / build-android (push) Has been cancelled
2026-01-24 07:59:49 +11:00
1de0ed67a2 bump version to 4.10.6 in tauri configuration
Some checks failed
Build / check-version (push) Successful in 6s
Build / build-linux (push) Failing after 3m24s
Build / build-windows (push) Has started running
Build / build-android (push) Has started running
Build / create-release (push) Has been cancelled
2026-01-24 07:51:53 +11:00
47f58730ee Update cinny submodule reference
Some checks failed
Build / check-version (push) Successful in 4s
Build / build-android (push) Failing after 9s
Build / create-release (push) Has been cancelled
Build / build-windows (push) Has been cancelled
Build / build-linux (push) Has been cancelled
2026-01-24 07:49:47 +11:00
01312be50d feat: add deep link and notification permissions to mobile and android schemas
- Introduced new permissions for deep link functionality including `allow-get-current`, `allow-is-registered`, `allow-register`, and `allow-unregister`.
- Added comprehensive notification permissions such as `allow-notify`, `allow-request-permission`, and others to enhance notification capabilities.
- Updated the mobile and android schemas to reflect these changes.
- Removed deprecated window state permissions from schemas.
- Updated the capabilities schema to include new default permissions for deep link and notification features.
- Refactored the Tauri application initialization to support new deep link plugin for mobile platforms.
2026-01-24 07:48:09 +11:00
8637654e88 Fix Linux package rename step - use find to avoid glob issues
All checks were successful
Build / check-version (push) Successful in 3s
Build / build-linux (push) Successful in 5m12s
Build / build-windows (push) Successful in 13m24s
Build / build-android (push) Successful in 31m8s
Build / create-release (push) Successful in 24s
2026-01-24 05:33:03 +11:00
0fd03b8496 Fix release workflow - create tag and release in same workflow run, bump to 4.10.5
Some checks failed
Build / check-version (push) Successful in 3s
Build / build-linux (push) Failing after 5m9s
Build / build-windows (push) Has started running
Build / build-android (push) Has been cancelled
Build / create-release (push) Has been cancelled
2026-01-24 05:25:14 +11:00
890b060ab4 Bump version to 4.10.3 in tauri configuration
All checks were successful
Build / check-version (push) Successful in 5s
Build / create-tag (push) Successful in 6s
Build / build-windows (push) Successful in 13m7s
Build / build-linux (push) Successful in 16m11s
Build / build-android (push) Successful in 27m0s
Build / create-release (push) Has been skipped
2026-01-24 04:45:13 +11:00
9d02cc6c5b Add caching for npm, Cargo, and Gradle to speed up builds
Some checks failed
Build / check-version (push) Successful in 6s
Build / create-tag (push) Has been skipped
Build / build-android (push) Has been cancelled
Build / create-release (push) Has been cancelled
Build / build-linux (push) Has been cancelled
Build / build-windows (push) Has been cancelled
2026-01-24 04:44:05 +11:00
68 changed files with 3544 additions and 1238 deletions

View File

@@ -10,6 +10,9 @@ on:
env: env:
TAURI_SIGNING_PRIVATE_KEY: ${{ secrets.TAURI_SIGNING_PRIVATE_KEY }} TAURI_SIGNING_PRIVATE_KEY: ${{ secrets.TAURI_SIGNING_PRIVATE_KEY }}
CARGO_INCREMENTAL: 0
CARGO_NET_RETRY: 10
RUSTUP_MAX_RETRIES: 10
jobs: jobs:
check-version: check-version:
@@ -37,22 +40,6 @@ jobs:
echo "Tag v$VERSION does not exist, will create release" echo "Tag v$VERSION does not exist, will create release"
echo "should_release=true" >> $GITHUB_OUTPUT echo "should_release=true" >> $GITHUB_OUTPUT
fi fi
create-tag:
runs-on: ubuntu-latest
needs: check-version
if: needs.check-version.outputs.should_release == 'true'
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Create and push tag
run: |
git config user.name "GitHub Actions"
git config user.email "actions@github.com"
git tag -a "v${{ needs.check-version.outputs.version }}" -m "Release v${{ needs.check-version.outputs.version }}"
git push origin "v${{ needs.check-version.outputs.version }}"
build-windows: build-windows:
runs-on: windows runs-on: windows
@@ -68,6 +55,28 @@ jobs:
with: with:
node-version: '20' node-version: '20'
- name: Cache npm dependencies
uses: actions/cache@v3
with:
path: |
~/.npm
node_modules
cinny/node_modules
key: npm-windows-${{ hashFiles('package-lock.json', 'cinny/package-lock.json') }}
restore-keys: |
npm-windows-
- name: Cache Cargo
uses: actions/cache@v3
with:
path: |
~/.cargo/registry
~/.cargo/git
src-tauri/target
key: cargo-windows-${{ hashFiles('src-tauri/Cargo.lock') }}
restore-keys: |
cargo-windows-
- name: Install Rust - name: Install Rust
uses: actions-rs/toolchain@v1 uses: actions-rs/toolchain@v1
with: with:
@@ -76,27 +85,45 @@ jobs:
override: true override: true
- name: Install dependencies (root) - name: Install dependencies (root)
run: npm install run: npm ci --prefer-offline
- name: Install dependencies (cinny) - name: Install dependencies (cinny)
working-directory: ./cinny working-directory: ./cinny
run: npm install run: npm ci --prefer-offline
- name: Build Tauri app - name: Build Tauri app
run: npm run tauri build run: npm run tauri build
- name: Rename MSI - name: Rename MSI files
shell: powershell shell: powershell
run: | run: |
$msi = Get-ChildItem "src-tauri/target/release/bundle/msi/*.msi" | Select-Object -First 1 $msi = Get-ChildItem "src-tauri/target/release/bundle/msi/*.msi" -Exclude "Cinny-*" | Select-Object -First 1
$newName = "Cinny-Windows-x64.msi" Copy-Item $msi.FullName "src-tauri/target/release/bundle/msi/Cinny-Windows-x64.msi"
Copy-Item $msi.FullName "src-tauri/target/release/bundle/msi/$newName" $msiZip = Get-ChildItem "src-tauri/target/release/bundle/msi/*.msi.zip" -Exclude "Cinny-*" | Select-Object -First 1
if ($msiZip) { Copy-Item $msiZip.FullName "src-tauri/target/release/bundle/msi/Cinny-Windows-x64.msi.zip" }
$msiZipSig = Get-ChildItem "src-tauri/target/release/bundle/msi/*.msi.zip.sig" -Exclude "Cinny-*" | Select-Object -First 1
if ($msiZipSig) { Copy-Item $msiZipSig.FullName "src-tauri/target/release/bundle/msi/Cinny-Windows-x64.msi.zip.sig" }
Get-ChildItem "src-tauri/target/release/bundle/msi/"
- name: Upload MSI installer - name: Upload MSI installer
uses: actions/upload-artifact@v3 uses: actions/upload-artifact@v3
with: with:
name: Cinny-Windows-x64.msi name: Cinny-Windows-x64.msi
path: src-tauri/target/release/bundle/msi/Cinny-Windows-x64.msi path: src-tauri/target/release/bundle/msi/Cinny-Windows-x64.msi
- name: Upload MSI updater zip
uses: actions/upload-artifact@v3
if: always()
with:
name: Cinny-Windows-x64.msi.zip
path: src-tauri/target/release/bundle/msi/Cinny-Windows-x64.msi.zip
- name: Upload MSI updater signature
uses: actions/upload-artifact@v3
if: always()
with:
name: Cinny-Windows-x64.msi.zip.sig
path: src-tauri/target/release/bundle/msi/Cinny-Windows-x64.msi.zip.sig
build-linux: build-linux:
runs-on: ubuntu-latest runs-on: ubuntu-latest
@@ -112,6 +139,28 @@ jobs:
with: with:
node-version: '20' node-version: '20'
- name: Cache npm dependencies
uses: actions/cache@v3
with:
path: |
~/.npm
node_modules
cinny/node_modules
key: npm-linux-${{ hashFiles('package-lock.json', 'cinny/package-lock.json') }}
restore-keys: |
npm-linux-
- name: Cache Cargo
uses: actions/cache@v3
with:
path: |
~/.cargo/registry
~/.cargo/git
src-tauri/target
key: cargo-linux-${{ hashFiles('src-tauri/Cargo.lock') }}
restore-keys: |
cargo-linux-
- name: Install Rust - name: Install Rust
uses: actions-rs/toolchain@v1 uses: actions-rs/toolchain@v1
with: with:
@@ -122,27 +171,32 @@ jobs:
- name: Install system dependencies - name: Install system dependencies
run: | run: |
sudo apt-get update sudo apt-get update
sudo apt-get install -y libwebkit2gtk-4.1-dev libssl-dev libgtk-3-dev libayatana-appindicator3-dev librsvg2-dev rpm sudo apt-get install -y libwebkit2gtk-4.1-dev libssl-dev libgtk-3-dev libayatana-appindicator3-dev librsvg2-dev rpm patchelf xdg-utils
- name: Install dependencies (root) - name: Install dependencies (root)
run: npm install run: npm ci --prefer-offline
- name: Install dependencies (cinny) - name: Install dependencies (cinny)
working-directory: ./cinny working-directory: ./cinny
run: npm install run: npm ci --prefer-offline
- name: Build Tauri app - name: Build Tauri app
run: npm run tauri build run: npm run tauri build
- name: Rename Linux packages - name: Rename Linux packages
run: | run: |
cp src-tauri/target/release/bundle/appimage/*.AppImage src-tauri/target/release/bundle/appimage/Cinny-Linux-x64.AppImage # Find and copy each file individually to avoid glob issues
cp src-tauri/target/release/bundle/deb/*.deb src-tauri/target/release/bundle/deb/Cinny-Linux-x64.deb find src-tauri/target/release/bundle/appimage -name "*.AppImage" -not -name "Cinny-Linux*" | head -1 | xargs -I {} cp {} src-tauri/target/release/bundle/appimage/Cinny-Linux-x64.AppImage
cp src-tauri/target/release/bundle/rpm/*.rpm src-tauri/target/release/bundle/rpm/Cinny-Linux-x64.rpm find src-tauri/target/release/bundle/deb -name "*.deb" -not -name "Cinny-Linux*" | head -1 | xargs -I {} cp {} src-tauri/target/release/bundle/deb/Cinny-Linux-x64.deb
# Copy signature file for updater find src-tauri/target/release/bundle/rpm -name "*.rpm" -not -name "Cinny-Linux*" | head -1 | xargs -I {} cp {} src-tauri/target/release/bundle/rpm/Cinny-Linux-x64.rpm
if [ -f src-tauri/target/release/bundle/appimage/*.AppImage.sig ]; then # Copy signature file for updater if it exists
cp src-tauri/target/release/bundle/appimage/*.AppImage.sig src-tauri/target/release/bundle/appimage/Cinny-Linux-x64.AppImage.sig if ls src-tauri/target/release/bundle/appimage/*.AppImage.sig 1> /dev/null 2>&1; then
find src-tauri/target/release/bundle/appimage -name "*.AppImage.sig" -not -name "Cinny-Linux*" | head -1 | xargs -I {} cp {} src-tauri/target/release/bundle/appimage/Cinny-Linux-x64.AppImage.sig
fi fi
# List what we have
ls -la src-tauri/target/release/bundle/appimage/
ls -la src-tauri/target/release/bundle/deb/
ls -la src-tauri/target/release/bundle/rpm/
- name: Upload AppImage - name: Upload AppImage
uses: actions/upload-artifact@v3 uses: actions/upload-artifact@v3
@@ -183,6 +237,39 @@ jobs:
with: with:
node-version: '20' node-version: '20'
- name: Cache npm dependencies
uses: actions/cache@v3
with:
path: |
~/.npm
node_modules
cinny/node_modules
key: npm-android-${{ hashFiles('package-lock.json', 'cinny/package-lock.json') }}
restore-keys: |
npm-android-
- name: Cache Cargo
uses: actions/cache@v3
with:
path: |
~/.cargo/registry
~/.cargo/git
src-tauri/target
key: cargo-android-${{ hashFiles('src-tauri/Cargo.lock') }}
restore-keys: |
cargo-android-
- name: Cache Gradle
uses: actions/cache@v3
with:
path: |
~/.gradle/caches
~/.gradle/wrapper
src-tauri/gen/android/.gradle
key: gradle-${{ hashFiles('src-tauri/gen/android/**/*.gradle*', 'src-tauri/gen/android/gradle-wrapper.properties') }}
restore-keys: |
gradle-
- name: Setup Java - name: Setup Java
uses: actions/setup-java@v4 uses: actions/setup-java@v4
with: with:
@@ -200,22 +287,19 @@ jobs:
- name: Add Android targets - name: Add Android targets
run: | run: |
rustup target add aarch64-linux-android --toolchain stable rustup target add aarch64-linux-android --toolchain stable
rustup target add armv7-linux-androideabi --toolchain stable
rustup target add x86_64-linux-android --toolchain stable
rustup target add i686-linux-android --toolchain stable
- name: Install dependencies (root) - name: Install dependencies (root)
run: npm install run: npm ci --prefer-offline
- name: Install dependencies (cinny) - name: Install dependencies (cinny)
working-directory: ./cinny working-directory: ./cinny
run: npm install run: npm ci --prefer-offline
- name: Build Android APK - name: Build Android APK
shell: powershell shell: powershell
run: | run: |
$env:PATH = "$env:USERPROFILE\.cargo\bin;$env:PATH" $env:PATH = "$env:USERPROFILE\.cargo\bin;$env:PATH"
npm run tauri android build npm run tauri android build -- --target aarch64
env: env:
ANDROID_HOME: ${{ env.ANDROID_HOME }} ANDROID_HOME: ${{ env.ANDROID_HOME }}
NDK_HOME: ${{ env.ANDROID_HOME }}/ndk/25.2.9519653 NDK_HOME: ${{ env.ANDROID_HOME }}/ndk/25.2.9519653
@@ -270,29 +354,40 @@ jobs:
create-release: create-release:
runs-on: ubuntu-latest runs-on: ubuntu-latest
needs: [build-windows, build-linux, build-android] needs: [check-version, build-windows, build-linux, build-android]
if: startsWith(github.ref, 'refs/tags/v') if: needs.check-version.outputs.should_release == 'true'
steps: steps:
- name: Checkout repository - name: Checkout repository
uses: actions/checkout@v4 uses: actions/checkout@v4
- name: Create and push tag
run: |
git config user.name "GitHub Actions"
git config user.email "actions@github.com"
git tag -a "v${{ needs.check-version.outputs.version }}" -m "Release v${{ needs.check-version.outputs.version }}"
git push origin "v${{ needs.check-version.outputs.version }}"
- name: Download all artifacts - name: Download all artifacts
uses: actions/download-artifact@v3 uses: actions/download-artifact@v3
with: with:
path: artifacts path: artifacts
- name: Get version from tag - name: Get version
id: version id: version
run: echo "VERSION=${GITHUB_REF#refs/tags/v}" >> $GITHUB_OUTPUT run: echo "VERSION=${{ needs.check-version.outputs.version }}" >> $GITHUB_OUTPUT
- name: Create update.json - name: Create update.json
run: | run: |
VERSION="${{ steps.version.outputs.VERSION }}" VERSION="${{ steps.version.outputs.VERSION }}"
APPIMAGE_SIG="" APPIMAGE_SIG=""
MSI_SIG=""
if [ -f "artifacts/Cinny-Linux-x64.AppImage.sig/Cinny-Linux-x64.AppImage.sig" ]; then if [ -f "artifacts/Cinny-Linux-x64.AppImage.sig/Cinny-Linux-x64.AppImage.sig" ]; then
APPIMAGE_SIG=$(cat "artifacts/Cinny-Linux-x64.AppImage.sig/Cinny-Linux-x64.AppImage.sig") APPIMAGE_SIG=$(cat "artifacts/Cinny-Linux-x64.AppImage.sig/Cinny-Linux-x64.AppImage.sig")
fi fi
if [ -f "artifacts/Cinny-Windows-x64.msi.zip.sig/Cinny-Windows-x64.msi.zip.sig" ]; then
MSI_SIG=$(cat "artifacts/Cinny-Windows-x64.msi.zip.sig/Cinny-Windows-x64.msi.zip.sig")
fi
cat > update.json << EOF cat > update.json << EOF
{ {
@@ -303,6 +398,10 @@ jobs:
"linux-x86_64": { "linux-x86_64": {
"signature": "${APPIMAGE_SIG}", "signature": "${APPIMAGE_SIG}",
"url": "http://synbox.ruv.wtf:8418/litruv/cinny-desktop/releases/download/v${VERSION}/Cinny-Linux-x64.AppImage" "url": "http://synbox.ruv.wtf:8418/litruv/cinny-desktop/releases/download/v${VERSION}/Cinny-Linux-x64.AppImage"
},
"windows-x86_64": {
"signature": "${MSI_SIG}",
"url": "http://synbox.ruv.wtf:8418/litruv/cinny-desktop/releases/download/v${VERSION}/Cinny-Windows-x64.msi.zip"
} }
} }
} }
@@ -313,13 +412,14 @@ jobs:
run: | run: |
mkdir -p release-files mkdir -p release-files
# Move artifacts out of subdirectories # Move artifacts out of subdirectories
find artifacts -type f \( -name "*.msi" -o -name "*.AppImage" -o -name "*.deb" -o -name "*.rpm" -o -name "*.apk" -o -name "*.sig" \) -exec cp {} release-files/ \; find artifacts -type f \( -name "*.msi" -o -name "*.msi.zip" -o -name "*.msi.zip.sig" -o -name "*.AppImage" -o -name "*.deb" -o -name "*.rpm" -o -name "*.apk" -o -name "*.sig" \) -exec cp {} release-files/ \;
cp update.json release-files/ cp update.json release-files/
ls -la release-files/ ls -la release-files/
- name: Create Release - name: Create Release
uses: softprops/action-gh-release@v1 uses: softprops/action-gh-release@v1
with: with:
tag_name: v${{ needs.check-version.outputs.version }}
files: release-files/* files: release-files/*
draft: false draft: false
prerelease: false prerelease: false

View File

@@ -1,173 +0,0 @@
name: "Publish Tauri App"
on:
release:
types: [published]
jobs:
# Windows-x86_64
windows-x86_64:
runs-on: windows-latest
steps:
- name: Checkout repository
uses: actions/checkout@v4.2.0
with:
submodules: true
- name: Setup node
uses: actions/setup-node@v4.4.0
with:
node-version: 20.12.2
cache: 'npm'
- name: Install Rust stable
uses: dtolnay/rust-toolchain@stable
- name: Install cinny dependencies
run: cd cinny && npm ci
- name: Install tauri dependencies
run: npm ci
- name: Build desktop app with Tauri
uses: tauri-apps/tauri-action@v0.5.14
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
TAURI_PRIVATE_KEY: ${{ secrets.TAURI_PRIVATE_KEY }}
TAURI_KEY_PASSWORD: ${{ secrets.TAURI_KEY_PASSWORD }}
NODE_OPTIONS: "--max_old_space_size=4096"
with:
releaseId: ${{ github.event.release.upload_url }}
- name: Get app version (windows)
run: |
$json = (Get-Content "src-tauri\tauri.conf.json" -Raw) | ConvertFrom-Json
$version = $json.package.version
echo "Version: ${version}"
echo "TAURI_VERSION=${version}" >> $Env:GITHUB_ENV
echo "${Env:TAURI_VERSION}"
shell: pwsh
- name: Move msi
run: Move-Item "src-tauri\target\release\bundle\msi\Cinny_${{ env.TAURI_VERSION }}_x64_en-US.msi" "src-tauri\target\release\bundle\msi\Cinny_desktop-x86_64.msi"
shell: pwsh
- name: Move msi.zip
run: Move-Item "src-tauri\target\release\bundle\msi\Cinny_${{ env.TAURI_VERSION }}_x64_en-US.msi.zip" "src-tauri\target\release\bundle\msi\Cinny_desktop-x86_64.msi.zip"
shell: pwsh
- name: Move msi.zip.sig
run: Move-Item "src-tauri\target\release\bundle\msi\Cinny_${{ env.TAURI_VERSION }}_x64_en-US.msi.zip.sig" "src-tauri\target\release\bundle\msi\Cinny_desktop-x86_64.msi.zip.sig"
shell: pwsh
- name: Upload tagged release
uses: softprops/action-gh-release@6cbd405e2c4e67a21c47fa9e383d020e4e28b836
with:
files: |
src-tauri/target/release/bundle/msi/Cinny_desktop-x86_64.msi
src-tauri/target/release/bundle/msi/Cinny_desktop-x86_64.msi.zip
src-tauri/target/release/bundle/msi/Cinny_desktop-x86_64.msi.zip.sig
# Linux-x86_64
linux-x86_64:
runs-on: ubuntu-22.04
steps:
- name: Checkout repository
uses: actions/checkout@v4.2.0
with:
submodules: true
- name: Setup node
uses: actions/setup-node@v4.4.0
with:
node-version: 20.12.2
cache: 'npm'
- name: Install Rust stable
uses: dtolnay/rust-toolchain@stable
- name: Install dependencies
run: |
sudo apt-get update
sudo apt-get install -y libgtk-3-dev libwebkit2gtk-4.0-dev libappindicator3-dev librsvg2-dev patchelf
- name: Install cinny dependencies
run: cd cinny && npm ci
- name: Install tauri dependencies
run: npm ci
- name: Build desktop app with Tauri
uses: tauri-apps/tauri-action@v0.5.14
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
TAURI_PRIVATE_KEY: ${{ secrets.TAURI_PRIVATE_KEY }}
TAURI_KEY_PASSWORD: ${{ secrets.TAURI_KEY_PASSWORD }}
NODE_OPTIONS: "--max_old_space_size=4096"
with:
releaseId: ${{ github.event.release.upload_url }}
- name: Get app version
id: vars
run: echo "tag=$(jq .package.version src-tauri/tauri.conf.json | tr -d '"')" >> $GITHUB_OUTPUT
- name: Move deb
run: mv "src-tauri/target/release/bundle/deb/cinny_${{ steps.vars.outputs.tag }}_amd64.deb" "src-tauri/target/release/bundle/deb/Cinny_desktop-x86_64.deb"
- name: Move AppImage
run: mv "src-tauri/target/release/bundle/appimage/cinny_${{ steps.vars.outputs.tag }}_amd64.AppImage" "src-tauri/target/release/bundle/appimage/Cinny_desktop-x86_64.AppImage"
- name: Move AppImage.tar.gz
run: mv "src-tauri/target/release/bundle/appimage/cinny_${{ steps.vars.outputs.tag }}_amd64.AppImage.tar.gz" "src-tauri/target/release/bundle/appimage/Cinny_desktop-x86_64.AppImage.tar.gz"
- name: Move AppImage.tar.gz.sig
run: mv "src-tauri/target/release/bundle/appimage/cinny_${{ steps.vars.outputs.tag }}_amd64.AppImage.tar.gz.sig" "src-tauri/target/release/bundle/appimage/Cinny_desktop-x86_64.AppImage.tar.gz.sig"
- name: Upload tagged release
uses: softprops/action-gh-release@6cbd405e2c4e67a21c47fa9e383d020e4e28b836
with:
files: |
src-tauri/target/release/bundle/deb/Cinny_desktop-x86_64.deb
src-tauri/target/release/bundle/appimage/Cinny_desktop-x86_64.AppImage
src-tauri/target/release/bundle/appimage/Cinny_desktop-x86_64.AppImage.tar.gz
src-tauri/target/release/bundle/appimage/Cinny_desktop-x86_64.AppImage.tar.gz.sig
# macos-universal
macos-universal:
runs-on: macos-latest
steps:
- name: Checkout repository
uses: actions/checkout@v4.2.0
with:
submodules: true
- name: Setup node
uses: actions/setup-node@v4.4.0
with:
node-version: 20.12.2
cache: 'npm'
- name: Install Rust stable
uses: dtolnay/rust-toolchain@stable
with:
target: aarch64-apple-darwin,x86_64-apple-darwin
- name: Install cinny dependencies
run: cd cinny && npm ci
- name: Install tauri dependencies
run: npm ci
- name: Build desktop app with Tauri
uses: tauri-apps/tauri-action@v0.5.14
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
TAURI_PRIVATE_KEY: ${{ secrets.TAURI_PRIVATE_KEY }}
TAURI_KEY_PASSWORD: ${{ secrets.TAURI_KEY_PASSWORD }}
NODE_OPTIONS: "--max_old_space_size=4096"
with:
releaseId: ${{ github.event.release.upload_url }}
args: "--target universal-apple-darwin"
- name: Get app version
id: vars
run: echo "tag=$(jq .package.version src-tauri/tauri.conf.json | tr -d '"')" >> $GITHUB_OUTPUT
- name: Move dmg
run: mv "src-tauri/target/universal-apple-darwin/release/bundle/dmg/Cinny_${{ steps.vars.outputs.tag }}_universal.dmg" "src-tauri/target/universal-apple-darwin/release/bundle/dmg/Cinny_desktop-universal.dmg"
- name: Move app.tar.gz
run: mv "src-tauri/target/universal-apple-darwin/release/bundle/macos/Cinny.app.tar.gz" "src-tauri/target/universal-apple-darwin/release/bundle/macos/Cinny_desktop-universal.app.tar.gz"
- name: Move app.tar.gz.sig
run: mv "src-tauri/target/universal-apple-darwin/release/bundle/macos/Cinny.app.tar.gz.sig" "src-tauri/target/universal-apple-darwin/release/bundle/macos/Cinny_desktop-universal.app.tar.gz.sig"
- name: Upload tagged release
uses: softprops/action-gh-release@6cbd405e2c4e67a21c47fa9e383d020e4e28b836
with:
files: |
src-tauri/target/universal-apple-darwin/release/bundle/dmg/Cinny_desktop-universal.dmg
src-tauri/target/universal-apple-darwin/release/bundle/macos/Cinny_desktop-universal.app.tar.gz
src-tauri/target/universal-apple-darwin/release/bundle/macos/Cinny_desktop-universal.app.tar.gz.sig
# Upload release.json
release-update:
if: always()
needs: [windows-x86_64, linux-x86_64, macos-universal]
runs-on: ubuntu-latest
steps:
- name: Checkout repository
uses: actions/checkout@v4.2.0
- name: Install dependencies
run: npm ci
- name: Run release.json
run: npm run release
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

BIN
appicon-square.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 295 KiB

BIN
appicon.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 730 KiB

2
cinny

Submodule cinny updated: 54f5fa95a6...1a452f52ca

BIN
paarrot.afdesign Normal file

Binary file not shown.

595
package-lock.json generated
View File

@@ -1,11 +1,11 @@
{ {
"name": "cinny", "name": "paarrot",
"version": "4.10.2", "version": "4.10.2",
"lockfileVersion": 3, "lockfileVersion": 3,
"requires": true, "requires": true,
"packages": { "packages": {
"": { "": {
"name": "cinny", "name": "paarrot",
"version": "4.10.2", "version": "4.10.2",
"license": "AGPL-3.0-only", "license": "AGPL-3.0-only",
"dependencies": { "dependencies": {
@@ -14,7 +14,9 @@
"devDependencies": { "devDependencies": {
"@actions/github": "6.0.0", "@actions/github": "6.0.0",
"@tauri-apps/cli": "^2.0.0", "@tauri-apps/cli": "^2.0.0",
"node-fetch": "3.3.2" "node-fetch": "3.3.2",
"png2icons": "2.0.1",
"sharp": "0.34.5"
}, },
"engines": { "engines": {
"node": ">=18.0.0" "node": ">=18.0.0"
@@ -42,6 +44,17 @@
"undici": "^5.25.4" "undici": "^5.25.4"
} }
}, },
"node_modules/@emnapi/runtime": {
"version": "1.8.1",
"resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.8.1.tgz",
"integrity": "sha512-mehfKSMWjjNol8659Z8KxEMrdSJDDot5SXMq00dM8BN4o+CLNXQ0xH2V7EchNHV4RmbZLmmPdEaXZc5H2FXmDg==",
"dev": true,
"license": "MIT",
"optional": true,
"dependencies": {
"tslib": "^2.4.0"
}
},
"node_modules/@fastify/busboy": { "node_modules/@fastify/busboy": {
"version": "2.0.0", "version": "2.0.0",
"resolved": "https://registry.npmjs.org/@fastify/busboy/-/busboy-2.0.0.tgz", "resolved": "https://registry.npmjs.org/@fastify/busboy/-/busboy-2.0.0.tgz",
@@ -51,6 +64,496 @@
"node": ">=14" "node": ">=14"
} }
}, },
"node_modules/@img/colour": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/@img/colour/-/colour-1.0.0.tgz",
"integrity": "sha512-A5P/LfWGFSl6nsckYtjw9da+19jB8hkJ6ACTGcDfEJ0aE+l2n2El7dsVM7UVHZQ9s2lmYMWlrS21YLy2IR1LUw==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=18"
}
},
"node_modules/@img/sharp-darwin-arm64": {
"version": "0.34.5",
"resolved": "https://registry.npmjs.org/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.34.5.tgz",
"integrity": "sha512-imtQ3WMJXbMY4fxb/Ndp6HBTNVtWCUI0WdobyheGf5+ad6xX8VIDO8u2xE4qc/fr08CKG/7dDseFtn6M6g/r3w==",
"cpu": [
"arm64"
],
"dev": true,
"license": "Apache-2.0",
"optional": true,
"os": [
"darwin"
],
"engines": {
"node": "^18.17.0 || ^20.3.0 || >=21.0.0"
},
"funding": {
"url": "https://opencollective.com/libvips"
},
"optionalDependencies": {
"@img/sharp-libvips-darwin-arm64": "1.2.4"
}
},
"node_modules/@img/sharp-darwin-x64": {
"version": "0.34.5",
"resolved": "https://registry.npmjs.org/@img/sharp-darwin-x64/-/sharp-darwin-x64-0.34.5.tgz",
"integrity": "sha512-YNEFAF/4KQ/PeW0N+r+aVVsoIY0/qxxikF2SWdp+NRkmMB7y9LBZAVqQ4yhGCm/H3H270OSykqmQMKLBhBJDEw==",
"cpu": [
"x64"
],
"dev": true,
"license": "Apache-2.0",
"optional": true,
"os": [
"darwin"
],
"engines": {
"node": "^18.17.0 || ^20.3.0 || >=21.0.0"
},
"funding": {
"url": "https://opencollective.com/libvips"
},
"optionalDependencies": {
"@img/sharp-libvips-darwin-x64": "1.2.4"
}
},
"node_modules/@img/sharp-libvips-darwin-arm64": {
"version": "1.2.4",
"resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.2.4.tgz",
"integrity": "sha512-zqjjo7RatFfFoP0MkQ51jfuFZBnVE2pRiaydKJ1G/rHZvnsrHAOcQALIi9sA5co5xenQdTugCvtb1cuf78Vf4g==",
"cpu": [
"arm64"
],
"dev": true,
"license": "LGPL-3.0-or-later",
"optional": true,
"os": [
"darwin"
],
"funding": {
"url": "https://opencollective.com/libvips"
}
},
"node_modules/@img/sharp-libvips-darwin-x64": {
"version": "1.2.4",
"resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.2.4.tgz",
"integrity": "sha512-1IOd5xfVhlGwX+zXv2N93k0yMONvUlANylbJw1eTah8K/Jtpi15KC+WSiaX/nBmbm2HxRM1gZ0nSdjSsrZbGKg==",
"cpu": [
"x64"
],
"dev": true,
"license": "LGPL-3.0-or-later",
"optional": true,
"os": [
"darwin"
],
"funding": {
"url": "https://opencollective.com/libvips"
}
},
"node_modules/@img/sharp-libvips-linux-arm": {
"version": "1.2.4",
"resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm/-/sharp-libvips-linux-arm-1.2.4.tgz",
"integrity": "sha512-bFI7xcKFELdiNCVov8e44Ia4u2byA+l3XtsAj+Q8tfCwO6BQ8iDojYdvoPMqsKDkuoOo+X6HZA0s0q11ANMQ8A==",
"cpu": [
"arm"
],
"dev": true,
"license": "LGPL-3.0-or-later",
"optional": true,
"os": [
"linux"
],
"funding": {
"url": "https://opencollective.com/libvips"
}
},
"node_modules/@img/sharp-libvips-linux-arm64": {
"version": "1.2.4",
"resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm64/-/sharp-libvips-linux-arm64-1.2.4.tgz",
"integrity": "sha512-excjX8DfsIcJ10x1Kzr4RcWe1edC9PquDRRPx3YVCvQv+U5p7Yin2s32ftzikXojb1PIFc/9Mt28/y+iRklkrw==",
"cpu": [
"arm64"
],
"dev": true,
"license": "LGPL-3.0-or-later",
"optional": true,
"os": [
"linux"
],
"funding": {
"url": "https://opencollective.com/libvips"
}
},
"node_modules/@img/sharp-libvips-linux-ppc64": {
"version": "1.2.4",
"resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-ppc64/-/sharp-libvips-linux-ppc64-1.2.4.tgz",
"integrity": "sha512-FMuvGijLDYG6lW+b/UvyilUWu5Ayu+3r2d1S8notiGCIyYU/76eig1UfMmkZ7vwgOrzKzlQbFSuQfgm7GYUPpA==",
"cpu": [
"ppc64"
],
"dev": true,
"license": "LGPL-3.0-or-later",
"optional": true,
"os": [
"linux"
],
"funding": {
"url": "https://opencollective.com/libvips"
}
},
"node_modules/@img/sharp-libvips-linux-riscv64": {
"version": "1.2.4",
"resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-riscv64/-/sharp-libvips-linux-riscv64-1.2.4.tgz",
"integrity": "sha512-oVDbcR4zUC0ce82teubSm+x6ETixtKZBh/qbREIOcI3cULzDyb18Sr/Wcyx7NRQeQzOiHTNbZFF1UwPS2scyGA==",
"cpu": [
"riscv64"
],
"dev": true,
"license": "LGPL-3.0-or-later",
"optional": true,
"os": [
"linux"
],
"funding": {
"url": "https://opencollective.com/libvips"
}
},
"node_modules/@img/sharp-libvips-linux-s390x": {
"version": "1.2.4",
"resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.2.4.tgz",
"integrity": "sha512-qmp9VrzgPgMoGZyPvrQHqk02uyjA0/QrTO26Tqk6l4ZV0MPWIW6LTkqOIov+J1yEu7MbFQaDpwdwJKhbJvuRxQ==",
"cpu": [
"s390x"
],
"dev": true,
"license": "LGPL-3.0-or-later",
"optional": true,
"os": [
"linux"
],
"funding": {
"url": "https://opencollective.com/libvips"
}
},
"node_modules/@img/sharp-libvips-linux-x64": {
"version": "1.2.4",
"resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.2.4.tgz",
"integrity": "sha512-tJxiiLsmHc9Ax1bz3oaOYBURTXGIRDODBqhveVHonrHJ9/+k89qbLl0bcJns+e4t4rvaNBxaEZsFtSfAdquPrw==",
"cpu": [
"x64"
],
"dev": true,
"license": "LGPL-3.0-or-later",
"optional": true,
"os": [
"linux"
],
"funding": {
"url": "https://opencollective.com/libvips"
}
},
"node_modules/@img/sharp-libvips-linuxmusl-arm64": {
"version": "1.2.4",
"resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-arm64/-/sharp-libvips-linuxmusl-arm64-1.2.4.tgz",
"integrity": "sha512-FVQHuwx1IIuNow9QAbYUzJ+En8KcVm9Lk5+uGUQJHaZmMECZmOlix9HnH7n1TRkXMS0pGxIJokIVB9SuqZGGXw==",
"cpu": [
"arm64"
],
"dev": true,
"license": "LGPL-3.0-or-later",
"optional": true,
"os": [
"linux"
],
"funding": {
"url": "https://opencollective.com/libvips"
}
},
"node_modules/@img/sharp-libvips-linuxmusl-x64": {
"version": "1.2.4",
"resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-x64/-/sharp-libvips-linuxmusl-x64-1.2.4.tgz",
"integrity": "sha512-+LpyBk7L44ZIXwz/VYfglaX/okxezESc6UxDSoyo2Ks6Jxc4Y7sGjpgU9s4PMgqgjj1gZCylTieNamqA1MF7Dg==",
"cpu": [
"x64"
],
"dev": true,
"license": "LGPL-3.0-or-later",
"optional": true,
"os": [
"linux"
],
"funding": {
"url": "https://opencollective.com/libvips"
}
},
"node_modules/@img/sharp-linux-arm": {
"version": "0.34.5",
"resolved": "https://registry.npmjs.org/@img/sharp-linux-arm/-/sharp-linux-arm-0.34.5.tgz",
"integrity": "sha512-9dLqsvwtg1uuXBGZKsxem9595+ujv0sJ6Vi8wcTANSFpwV/GONat5eCkzQo/1O6zRIkh0m/8+5BjrRr7jDUSZw==",
"cpu": [
"arm"
],
"dev": true,
"license": "Apache-2.0",
"optional": true,
"os": [
"linux"
],
"engines": {
"node": "^18.17.0 || ^20.3.0 || >=21.0.0"
},
"funding": {
"url": "https://opencollective.com/libvips"
},
"optionalDependencies": {
"@img/sharp-libvips-linux-arm": "1.2.4"
}
},
"node_modules/@img/sharp-linux-arm64": {
"version": "0.34.5",
"resolved": "https://registry.npmjs.org/@img/sharp-linux-arm64/-/sharp-linux-arm64-0.34.5.tgz",
"integrity": "sha512-bKQzaJRY/bkPOXyKx5EVup7qkaojECG6NLYswgktOZjaXecSAeCWiZwwiFf3/Y+O1HrauiE3FVsGxFg8c24rZg==",
"cpu": [
"arm64"
],
"dev": true,
"license": "Apache-2.0",
"optional": true,
"os": [
"linux"
],
"engines": {
"node": "^18.17.0 || ^20.3.0 || >=21.0.0"
},
"funding": {
"url": "https://opencollective.com/libvips"
},
"optionalDependencies": {
"@img/sharp-libvips-linux-arm64": "1.2.4"
}
},
"node_modules/@img/sharp-linux-ppc64": {
"version": "0.34.5",
"resolved": "https://registry.npmjs.org/@img/sharp-linux-ppc64/-/sharp-linux-ppc64-0.34.5.tgz",
"integrity": "sha512-7zznwNaqW6YtsfrGGDA6BRkISKAAE1Jo0QdpNYXNMHu2+0dTrPflTLNkpc8l7MUP5M16ZJcUvysVWWrMefZquA==",
"cpu": [
"ppc64"
],
"dev": true,
"license": "Apache-2.0",
"optional": true,
"os": [
"linux"
],
"engines": {
"node": "^18.17.0 || ^20.3.0 || >=21.0.0"
},
"funding": {
"url": "https://opencollective.com/libvips"
},
"optionalDependencies": {
"@img/sharp-libvips-linux-ppc64": "1.2.4"
}
},
"node_modules/@img/sharp-linux-riscv64": {
"version": "0.34.5",
"resolved": "https://registry.npmjs.org/@img/sharp-linux-riscv64/-/sharp-linux-riscv64-0.34.5.tgz",
"integrity": "sha512-51gJuLPTKa7piYPaVs8GmByo7/U7/7TZOq+cnXJIHZKavIRHAP77e3N2HEl3dgiqdD/w0yUfiJnII77PuDDFdw==",
"cpu": [
"riscv64"
],
"dev": true,
"license": "Apache-2.0",
"optional": true,
"os": [
"linux"
],
"engines": {
"node": "^18.17.0 || ^20.3.0 || >=21.0.0"
},
"funding": {
"url": "https://opencollective.com/libvips"
},
"optionalDependencies": {
"@img/sharp-libvips-linux-riscv64": "1.2.4"
}
},
"node_modules/@img/sharp-linux-s390x": {
"version": "0.34.5",
"resolved": "https://registry.npmjs.org/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.34.5.tgz",
"integrity": "sha512-nQtCk0PdKfho3eC5MrbQoigJ2gd1CgddUMkabUj+rBevs8tZ2cULOx46E7oyX+04WGfABgIwmMC0VqieTiR4jg==",
"cpu": [
"s390x"
],
"dev": true,
"license": "Apache-2.0",
"optional": true,
"os": [
"linux"
],
"engines": {
"node": "^18.17.0 || ^20.3.0 || >=21.0.0"
},
"funding": {
"url": "https://opencollective.com/libvips"
},
"optionalDependencies": {
"@img/sharp-libvips-linux-s390x": "1.2.4"
}
},
"node_modules/@img/sharp-linux-x64": {
"version": "0.34.5",
"resolved": "https://registry.npmjs.org/@img/sharp-linux-x64/-/sharp-linux-x64-0.34.5.tgz",
"integrity": "sha512-MEzd8HPKxVxVenwAa+JRPwEC7QFjoPWuS5NZnBt6B3pu7EG2Ge0id1oLHZpPJdn3OQK+BQDiw9zStiHBTJQQQQ==",
"cpu": [
"x64"
],
"dev": true,
"license": "Apache-2.0",
"optional": true,
"os": [
"linux"
],
"engines": {
"node": "^18.17.0 || ^20.3.0 || >=21.0.0"
},
"funding": {
"url": "https://opencollective.com/libvips"
},
"optionalDependencies": {
"@img/sharp-libvips-linux-x64": "1.2.4"
}
},
"node_modules/@img/sharp-linuxmusl-arm64": {
"version": "0.34.5",
"resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.34.5.tgz",
"integrity": "sha512-fprJR6GtRsMt6Kyfq44IsChVZeGN97gTD331weR1ex1c1rypDEABN6Tm2xa1wE6lYb5DdEnk03NZPqA7Id21yg==",
"cpu": [
"arm64"
],
"dev": true,
"license": "Apache-2.0",
"optional": true,
"os": [
"linux"
],
"engines": {
"node": "^18.17.0 || ^20.3.0 || >=21.0.0"
},
"funding": {
"url": "https://opencollective.com/libvips"
},
"optionalDependencies": {
"@img/sharp-libvips-linuxmusl-arm64": "1.2.4"
}
},
"node_modules/@img/sharp-linuxmusl-x64": {
"version": "0.34.5",
"resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.34.5.tgz",
"integrity": "sha512-Jg8wNT1MUzIvhBFxViqrEhWDGzqymo3sV7z7ZsaWbZNDLXRJZoRGrjulp60YYtV4wfY8VIKcWidjojlLcWrd8Q==",
"cpu": [
"x64"
],
"dev": true,
"license": "Apache-2.0",
"optional": true,
"os": [
"linux"
],
"engines": {
"node": "^18.17.0 || ^20.3.0 || >=21.0.0"
},
"funding": {
"url": "https://opencollective.com/libvips"
},
"optionalDependencies": {
"@img/sharp-libvips-linuxmusl-x64": "1.2.4"
}
},
"node_modules/@img/sharp-wasm32": {
"version": "0.34.5",
"resolved": "https://registry.npmjs.org/@img/sharp-wasm32/-/sharp-wasm32-0.34.5.tgz",
"integrity": "sha512-OdWTEiVkY2PHwqkbBI8frFxQQFekHaSSkUIJkwzclWZe64O1X4UlUjqqqLaPbUpMOQk6FBu/HtlGXNblIs0huw==",
"cpu": [
"wasm32"
],
"dev": true,
"license": "Apache-2.0 AND LGPL-3.0-or-later AND MIT",
"optional": true,
"dependencies": {
"@emnapi/runtime": "^1.7.0"
},
"engines": {
"node": "^18.17.0 || ^20.3.0 || >=21.0.0"
},
"funding": {
"url": "https://opencollective.com/libvips"
}
},
"node_modules/@img/sharp-win32-arm64": {
"version": "0.34.5",
"resolved": "https://registry.npmjs.org/@img/sharp-win32-arm64/-/sharp-win32-arm64-0.34.5.tgz",
"integrity": "sha512-WQ3AgWCWYSb2yt+IG8mnC6Jdk9Whs7O0gxphblsLvdhSpSTtmu69ZG1Gkb6NuvxsNACwiPV6cNSZNzt0KPsw7g==",
"cpu": [
"arm64"
],
"dev": true,
"license": "Apache-2.0 AND LGPL-3.0-or-later",
"optional": true,
"os": [
"win32"
],
"engines": {
"node": "^18.17.0 || ^20.3.0 || >=21.0.0"
},
"funding": {
"url": "https://opencollective.com/libvips"
}
},
"node_modules/@img/sharp-win32-ia32": {
"version": "0.34.5",
"resolved": "https://registry.npmjs.org/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.34.5.tgz",
"integrity": "sha512-FV9m/7NmeCmSHDD5j4+4pNI8Cp3aW+JvLoXcTUo0IqyjSfAZJ8dIUmijx1qaJsIiU+Hosw6xM5KijAWRJCSgNg==",
"cpu": [
"ia32"
],
"dev": true,
"license": "Apache-2.0 AND LGPL-3.0-or-later",
"optional": true,
"os": [
"win32"
],
"engines": {
"node": "^18.17.0 || ^20.3.0 || >=21.0.0"
},
"funding": {
"url": "https://opencollective.com/libvips"
}
},
"node_modules/@img/sharp-win32-x64": {
"version": "0.34.5",
"resolved": "https://registry.npmjs.org/@img/sharp-win32-x64/-/sharp-win32-x64-0.34.5.tgz",
"integrity": "sha512-+29YMsqY2/9eFEiW93eqWnuLcWcufowXewwSNIT6UwZdUUCrM3oFjMWH/Z6/TMmb4hlFenmfAVbpWeup2jryCw==",
"cpu": [
"x64"
],
"dev": true,
"license": "Apache-2.0 AND LGPL-3.0-or-later",
"optional": true,
"os": [
"win32"
],
"engines": {
"node": "^18.17.0 || ^20.3.0 || >=21.0.0"
},
"funding": {
"url": "https://opencollective.com/libvips"
}
},
"node_modules/@octokit/auth-token": { "node_modules/@octokit/auth-token": {
"version": "4.0.0", "version": "4.0.0",
"resolved": "https://registry.npmjs.org/@octokit/auth-token/-/auth-token-4.0.0.tgz", "resolved": "https://registry.npmjs.org/@octokit/auth-token/-/auth-token-4.0.0.tgz",
@@ -429,6 +932,16 @@
"integrity": "sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ==", "integrity": "sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ==",
"dev": true "dev": true
}, },
"node_modules/detect-libc": {
"version": "2.1.2",
"resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz",
"integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==",
"dev": true,
"license": "Apache-2.0",
"engines": {
"node": ">=8"
}
},
"node_modules/fetch-blob": { "node_modules/fetch-blob": {
"version": "3.2.0", "version": "3.2.0",
"resolved": "https://registry.npmjs.org/fetch-blob/-/fetch-blob-3.2.0.tgz", "resolved": "https://registry.npmjs.org/fetch-blob/-/fetch-blob-3.2.0.tgz",
@@ -519,6 +1032,82 @@
"wrappy": "1" "wrappy": "1"
} }
}, },
"node_modules/png2icons": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/png2icons/-/png2icons-2.0.1.tgz",
"integrity": "sha512-GDEQJr8OG4e6JMp7mABtXFSEpgJa1CCpbQiAR+EjhkHJHnUL9zPPtbOrjsMD8gUbikgv3j7x404b0YJsV3aVFA==",
"dev": true,
"license": "MIT",
"bin": {
"png2icons": "png2icons-cli.js"
}
},
"node_modules/semver": {
"version": "7.7.3",
"resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz",
"integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==",
"dev": true,
"license": "ISC",
"bin": {
"semver": "bin/semver.js"
},
"engines": {
"node": ">=10"
}
},
"node_modules/sharp": {
"version": "0.34.5",
"resolved": "https://registry.npmjs.org/sharp/-/sharp-0.34.5.tgz",
"integrity": "sha512-Ou9I5Ft9WNcCbXrU9cMgPBcCK8LiwLqcbywW3t4oDV37n1pzpuNLsYiAV8eODnjbtQlSDwZ2cUEeQz4E54Hltg==",
"dev": true,
"hasInstallScript": true,
"license": "Apache-2.0",
"dependencies": {
"@img/colour": "^1.0.0",
"detect-libc": "^2.1.2",
"semver": "^7.7.3"
},
"engines": {
"node": "^18.17.0 || ^20.3.0 || >=21.0.0"
},
"funding": {
"url": "https://opencollective.com/libvips"
},
"optionalDependencies": {
"@img/sharp-darwin-arm64": "0.34.5",
"@img/sharp-darwin-x64": "0.34.5",
"@img/sharp-libvips-darwin-arm64": "1.2.4",
"@img/sharp-libvips-darwin-x64": "1.2.4",
"@img/sharp-libvips-linux-arm": "1.2.4",
"@img/sharp-libvips-linux-arm64": "1.2.4",
"@img/sharp-libvips-linux-ppc64": "1.2.4",
"@img/sharp-libvips-linux-riscv64": "1.2.4",
"@img/sharp-libvips-linux-s390x": "1.2.4",
"@img/sharp-libvips-linux-x64": "1.2.4",
"@img/sharp-libvips-linuxmusl-arm64": "1.2.4",
"@img/sharp-libvips-linuxmusl-x64": "1.2.4",
"@img/sharp-linux-arm": "0.34.5",
"@img/sharp-linux-arm64": "0.34.5",
"@img/sharp-linux-ppc64": "0.34.5",
"@img/sharp-linux-riscv64": "0.34.5",
"@img/sharp-linux-s390x": "0.34.5",
"@img/sharp-linux-x64": "0.34.5",
"@img/sharp-linuxmusl-arm64": "0.34.5",
"@img/sharp-linuxmusl-x64": "0.34.5",
"@img/sharp-wasm32": "0.34.5",
"@img/sharp-win32-arm64": "0.34.5",
"@img/sharp-win32-ia32": "0.34.5",
"@img/sharp-win32-x64": "0.34.5"
}
},
"node_modules/tslib": {
"version": "2.8.1",
"resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz",
"integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==",
"dev": true,
"license": "0BSD",
"optional": true
},
"node_modules/tunnel": { "node_modules/tunnel": {
"version": "0.0.6", "version": "0.0.6",
"resolved": "https://registry.npmjs.org/tunnel/-/tunnel-0.0.6.tgz", "resolved": "https://registry.npmjs.org/tunnel/-/tunnel-0.0.6.tgz",

View File

@@ -1,5 +1,5 @@
{ {
"name": "cinny", "name": "paarrot",
"version": "4.10.2", "version": "4.10.2",
"description": "Yet another matrix client", "description": "Yet another matrix client",
"main": "index.js", "main": "index.js",
@@ -7,7 +7,7 @@
"node": ">=18.0.0" "node": ">=18.0.0"
}, },
"scripts": { "scripts": {
"tauri": "powershell Copy-Item config.json cinny/; tauri", "tauri": "node -e \"require('fs').copyFileSync('config.json', 'cinny/config.json')\" && tauri",
"release": "node scripts/release.mjs" "release": "node scripts/release.mjs"
}, },
"keywords": [], "keywords": [],
@@ -19,6 +19,8 @@
"devDependencies": { "devDependencies": {
"@actions/github": "6.0.0", "@actions/github": "6.0.0",
"@tauri-apps/cli": "^2.0.0", "@tauri-apps/cli": "^2.0.0",
"node-fetch": "3.3.2" "node-fetch": "3.3.2",
"png2icons": "2.0.1",
"sharp": "0.34.5"
} }
} }

152
scripts/generate-icons.mjs Normal file
View File

@@ -0,0 +1,152 @@
import sharp from 'sharp';
import { promises as fs } from 'fs';
import path from 'path';
import { fileURLToPath } from 'url';
const __dirname = path.dirname(fileURLToPath(import.meta.url));
const rootDir = path.resolve(__dirname, '..');
const sourceIcon = path.join(rootDir, 'appicon-square.png');
// Tauri desktop icons
const tauriIcons = [
{ name: '32x32.png', size: 32 },
{ name: '128x128.png', size: 128 },
{ name: '128x128@2x.png', size: 256 },
{ name: 'icon.png', size: 512 },
{ name: 'Square30x30Logo.png', size: 30 },
{ name: 'Square44x44Logo.png', size: 44 },
{ name: 'Square71x71Logo.png', size: 71 },
{ name: 'Square89x89Logo.png', size: 89 },
{ name: 'Square107x107Logo.png', size: 107 },
{ name: 'Square142x142Logo.png', size: 142 },
{ name: 'Square150x150Logo.png', size: 150 },
{ name: 'Square284x284Logo.png', size: 284 },
{ name: 'Square310x310Logo.png', size: 310 },
{ name: 'StoreLogo.png', size: 50 },
];
// Android mipmap sizes
const androidMipmaps = [
{ folder: 'mipmap-mdpi', size: 48 },
{ folder: 'mipmap-hdpi', size: 72 },
{ folder: 'mipmap-xhdpi', size: 96 },
{ folder: 'mipmap-xxhdpi', size: 144 },
{ folder: 'mipmap-xxxhdpi', size: 192 },
];
// Android adaptive icon foreground sizes (with padding for safe zone)
const androidForegroundSizes = [
{ folder: 'mipmap-mdpi', size: 108 },
{ folder: 'mipmap-hdpi', size: 162 },
{ folder: 'mipmap-xhdpi', size: 216 },
{ folder: 'mipmap-xxhdpi', size: 324 },
{ folder: 'mipmap-xxxhdpi', size: 432 },
];
async function generateTauriIcons() {
const iconsDir = path.join(rootDir, 'src-tauri', 'icons');
for (const icon of tauriIcons) {
const outputPath = path.join(iconsDir, icon.name);
await sharp(sourceIcon)
.resize(icon.size, icon.size)
.png()
.toFile(outputPath);
console.log(`Generated: ${icon.name}`);
}
// Generate ICO file (Windows)
const icoPath = path.join(iconsDir, 'icon.ico');
const sizes = [16, 24, 32, 48, 64, 128, 256];
const icoBuffers = await Promise.all(
sizes.map(size =>
sharp(sourceIcon)
.resize(size, size)
.png()
.toBuffer()
)
);
// For ICO, we'll just use the 256x256 as the main icon
await sharp(sourceIcon)
.resize(256, 256)
.png()
.toFile(icoPath.replace('.ico', '.ico.png'));
// Copy as ico (sharp doesn't support ico directly, need to use png2ico or similar)
console.log('Note: ICO file needs manual conversion or use png2ico tool');
// Generate ICNS file (macOS) - sharp doesn't support icns directly
console.log('Note: ICNS file needs manual conversion or use iconutil on macOS');
}
async function generateAndroidIcons() {
const androidResDir = path.join(rootDir, 'src-tauri', 'gen', 'android', 'app', 'src', 'main', 'res');
for (const mipmap of androidMipmaps) {
const outputDir = path.join(androidResDir, mipmap.folder);
// Standard launcher icon
await sharp(sourceIcon)
.resize(mipmap.size, mipmap.size)
.png()
.toFile(path.join(outputDir, 'ic_launcher.png'));
console.log(`Generated: ${mipmap.folder}/ic_launcher.png`);
// Round launcher icon
const roundSize = mipmap.size;
const roundIcon = await sharp(sourceIcon)
.resize(roundSize, roundSize)
.png()
.toBuffer();
// Create circular mask
const circleMask = Buffer.from(
`<svg><circle cx="${roundSize/2}" cy="${roundSize/2}" r="${roundSize/2}" fill="white"/></svg>`
);
await sharp(roundIcon)
.composite([{
input: circleMask,
blend: 'dest-in'
}])
.png()
.toFile(path.join(outputDir, 'ic_launcher_round.png'));
console.log(`Generated: ${mipmap.folder}/ic_launcher_round.png`);
}
// Generate adaptive icon foregrounds
for (const fg of androidForegroundSizes) {
const outputDir = path.join(androidResDir, fg.folder);
const iconSize = Math.floor(fg.size * 0.66); // Icon should be ~66% of the foreground
const padding = Math.floor((fg.size - iconSize) / 2);
await sharp(sourceIcon)
.resize(iconSize, iconSize)
.extend({
top: padding,
bottom: fg.size - iconSize - padding,
left: padding,
right: fg.size - iconSize - padding,
background: { r: 0, g: 0, b: 0, alpha: 0 }
})
.png()
.toFile(path.join(outputDir, 'ic_launcher_foreground.png'));
console.log(`Generated: ${fg.folder}/ic_launcher_foreground.png`);
}
}
async function main() {
console.log('Generating icons from:', sourceIcon);
console.log('');
console.log('=== Tauri Desktop Icons ===');
await generateTauriIcons();
console.log('');
console.log('=== Android Icons ===');
await generateAndroidIcons();
console.log('');
console.log('Done! Note: ICO and ICNS files may need manual conversion.');
}
main().catch(console.error);

View File

@@ -0,0 +1,9 @@
[target.x86_64-pc-windows-msvc]
linker = "rust-lld.exe"
rustflags = ["-C", "link-arg=-fuse-ld=lld"]
[target.x86_64-unknown-linux-gnu]
rustflags = ["-C", "link-arg=-fuse-ld=lld"]
[target.aarch64-linux-android]
rustflags = ["-C", "link-arg=-fuse-ld=lld"]

907
src-tauri/Cargo.lock generated

File diff suppressed because it is too large Load Diff

View File

@@ -1,18 +1,18 @@
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
[package] [package]
name = "cinny" name = "paarrot"
version = "4.10.2" version = "4.10.2"
description = "Yet another matrix client" description = "Yet another matrix client"
authors = ["Ajay Bura"] authors = ["Ajay Bura"]
license = "AGPL-3.0-only" license = "AGPL-3.0-only"
repository = "https://github.com/cinnyapp/cinny-desktop" repository = "https://github.com/cinnyapp/cinny-desktop"
default-run = "cinny" default-run = "paarrot"
edition = "2021" edition = "2021"
rust-version = "1.70" rust-version = "1.70"
[lib] [lib]
name = "cinny_lib" name = "paarrot_lib"
crate-type = ["staticlib", "cdylib", "lib"] crate-type = ["staticlib", "cdylib", "lib"]
[build-dependencies] [build-dependencies]
@@ -21,19 +21,29 @@ tauri-build = { version = "2", features = [] }
[dependencies] [dependencies]
serde_json = "1.0" serde_json = "1.0"
serde = { version = "1.0", features = ["derive"] } serde = { version = "1.0", features = ["derive"] }
tauri = { version = "2", features = ["devtools"] } tauri = { version = "2", features = ["devtools", "tray-icon", "image-png"] }
tauri-plugin-localhost = "2" tauri-plugin-opener = "2"
tauri-plugin-window-state = "2"
tauri-plugin-shell = "2"
tauri-plugin-notification = "2" tauri-plugin-notification = "2"
[target."cfg(target_os = \"linux\")".dependencies]
arboard = { version = "3", features = ["wayland-data-control"] }
png = "0.17"
base64 = "0.22"
[target."cfg(any(target_os = \"android\", target_os = \"ios\"))".dependencies] [target."cfg(any(target_os = \"android\", target_os = \"ios\"))".dependencies]
tauri-plugin-deep-link = "2" tauri-plugin-deep-link = "2"
[target."cfg(not(any(target_os = \"android\", target_os = \"ios\")))".dependencies] [target."cfg(not(any(target_os = \"android\", target_os = \"ios\")))".dependencies]
tauri-plugin-localhost = "2"
tauri-plugin-window-state = "2"
tauri-plugin-single-instance = "2" tauri-plugin-single-instance = "2"
tauri-plugin-updater = "2" tauri-plugin-updater = "2"
tauri-plugin-autostart = "2"
open = "5"
[features] [features]
default = ["custom-protocol"] default = ["custom-protocol"]
custom-protocol = ["tauri/custom-protocol"] custom-protocol = ["tauri/custom-protocol"]
[dependencies.ppv-lite86]
version = "=0.2.20"

View File

@@ -0,0 +1,15 @@
{
"$schema": "../gen/schemas/desktop-schema.json",
"identifier": "default",
"description": "Default capability for all windows",
"windows": ["*"],
"platforms": ["linux", "windows", "macOS"],
"permissions": [
"core:default",
"opener:default",
"opener:allow-open-url",
"opener:allow-default-urls",
"notification:default",
"autostart:default"
]
}

View File

@@ -0,0 +1,12 @@
{
"$schema": "../gen/schemas/mobile-schema.json",
"identifier": "mobile",
"description": "Default capability for mobile",
"windows": ["*"],
"platforms": ["android", "iOS"],
"permissions": [
"core:default",
"notification:default",
"deep-link:default"
]
}

View File

@@ -1,4 +1,4 @@
/src/main/java/in/cinny/app/generated /src/main/java/wtf/ruv/paarrot/generated
/src/main/jniLibs/**/*.so /src/main/jniLibs/**/*.so
/src/main/assets/tauri.conf.json /src/main/assets/tauri.conf.json
/tauri.build.gradle.kts /tauri.build.gradle.kts

View File

@@ -15,14 +15,17 @@ val tauriProperties = Properties().apply {
android { android {
compileSdk = 36 compileSdk = 36
namespace = "in.cinny.app" namespace = "wtf.ruv.paarrot"
defaultConfig { defaultConfig {
manifestPlaceholders["usesCleartextTraffic"] = "false" manifestPlaceholders["usesCleartextTraffic"] = "false"
applicationId = "in.cinny.app" applicationId = "wtf.ruv.paarrot"
minSdk = 24 minSdk = 24
targetSdk = 36 targetSdk = 36
versionCode = tauriProperties.getProperty("tauri.android.versionCode", "1").toInt() versionCode = tauriProperties.getProperty("tauri.android.versionCode", "1").toInt()
versionName = tauriProperties.getProperty("tauri.android.versionName", "1.0") versionName = tauriProperties.getProperty("tauri.android.versionName", "1.0")
ndk {
abiFilters += listOf("arm64-v8a")
}
} }
buildTypes { buildTypes {
getByName("debug") { getByName("debug") {

View File

@@ -8,6 +8,8 @@
<uses-permission android:name="android.permission.FOREGROUND_SERVICE_DATA_SYNC" /> <uses-permission android:name="android.permission.FOREGROUND_SERVICE_DATA_SYNC" />
<uses-permission android:name="android.permission.WAKE_LOCK" /> <uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS" /> <uses-permission android:name="android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS" />
<uses-permission android:name="android.permission.SCHEDULE_EXACT_ALARM" android:maxSdkVersion="32" />
<uses-permission android:name="android.permission.USE_EXACT_ALARM" />
<!-- AndroidTV support --> <!-- AndroidTV support -->
<uses-feature android:name="android.software.leanback" android:required="false" /> <uses-feature android:name="android.software.leanback" android:required="false" />
@@ -15,7 +17,7 @@
<application <application
android:icon="@mipmap/ic_launcher" android:icon="@mipmap/ic_launcher"
android:label="@string/app_name" android:label="@string/app_name"
android:theme="@style/Theme.cinny" android:theme="@style/Theme.paarrot"
android:usesCleartextTraffic="${usesCleartextTraffic}"> android:usesCleartextTraffic="${usesCleartextTraffic}">
<activity <activity
android:configChanges="orientation|keyboardHidden|keyboard|screenSize|locale|smallestScreenSize|screenLayout|uiMode" android:configChanges="orientation|keyboardHidden|keyboard|screenSize|locale|smallestScreenSize|screenLayout|uiMode"

View File

@@ -1,18 +0,0 @@
package `in`.cinny.app
import android.content.BroadcastReceiver
import android.content.Context
import android.content.Intent
/**
* Receives boot completed broadcast to restart the sync service
* after device reboot.
*/
class BootReceiver : BroadcastReceiver() {
override fun onReceive(context: Context, intent: Intent) {
if (intent.action == Intent.ACTION_BOOT_COMPLETED) {
// Start the sync service after boot
SyncService.start(context)
}
}
}

View File

@@ -1,48 +0,0 @@
package `in`.cinny.app
import android.Manifest
import android.content.pm.PackageManager
import android.os.Build
import android.os.Bundle
import androidx.core.app.ActivityCompat
import androidx.core.content.ContextCompat
/**
* Main activity for Cinny. Handles permission requests and
* starts the background sync service for notifications.
*/
class MainActivity : TauriActivity() {
companion object {
private const val NOTIFICATION_PERMISSION_CODE = 1001
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
requestNotificationPermission()
startSyncService()
}
override fun onResume() {
super.onResume()
// Ensure sync service is running when app is in foreground
startSyncService()
}
private fun requestNotificationPermission() {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
if (ContextCompat.checkSelfPermission(this, Manifest.permission.POST_NOTIFICATIONS)
!= PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(
this,
arrayOf(Manifest.permission.POST_NOTIFICATIONS),
NOTIFICATION_PERMISSION_CODE
)
}
}
}
private fun startSyncService() {
SyncService.start(this)
}
}

View File

@@ -1,114 +0,0 @@
package `in`.cinny.app
import android.app.Notification
import android.app.NotificationChannel
import android.app.NotificationManager
import android.app.PendingIntent
import android.app.Service
import android.content.Context
import android.content.Intent
import android.os.Build
import android.os.IBinder
import android.os.PowerManager
import androidx.core.app.NotificationCompat
/**
* Foreground service to keep Matrix sync connection alive in background.
* This service maintains a wake lock and shows a persistent notification
* to prevent Android from killing the app while syncing.
*/
class SyncService : Service() {
companion object {
private const val CHANNEL_ID = "cinny_sync_channel"
private const val NOTIFICATION_ID = 1001
private const val WAKE_LOCK_TAG = "Cinny:SyncWakeLock"
fun start(context: Context) {
val intent = Intent(context, SyncService::class.java)
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
context.startForegroundService(intent)
} else {
context.startService(intent)
}
}
fun stop(context: Context) {
val intent = Intent(context, SyncService::class.java)
context.stopService(intent)
}
}
private var wakeLock: PowerManager.WakeLock? = null
override fun onBind(intent: Intent?): IBinder? = null
override fun onCreate() {
super.onCreate()
createNotificationChannel()
acquireWakeLock()
}
override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {
val notification = createNotification()
startForeground(NOTIFICATION_ID, notification)
return START_STICKY
}
override fun onDestroy() {
releaseWakeLock()
super.onDestroy()
}
private fun createNotificationChannel() {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
val channel = NotificationChannel(
CHANNEL_ID,
"Matrix Sync",
NotificationManager.IMPORTANCE_LOW
).apply {
description = "Keeps Cinny connected for message notifications"
setShowBadge(false)
}
val manager = getSystemService(NotificationManager::class.java)
manager.createNotificationChannel(channel)
}
}
private fun createNotification(): Notification {
val intent = Intent(this, MainActivity::class.java)
val pendingIntent = PendingIntent.getActivity(
this, 0, intent,
PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE
)
return NotificationCompat.Builder(this, CHANNEL_ID)
.setContentTitle("Cinny")
.setContentText("Connected to Matrix")
.setSmallIcon(R.mipmap.ic_launcher)
.setOngoing(true)
.setContentIntent(pendingIntent)
.setPriority(NotificationCompat.PRIORITY_LOW)
.setCategory(NotificationCompat.CATEGORY_SERVICE)
.build()
}
private fun acquireWakeLock() {
val powerManager = getSystemService(Context.POWER_SERVICE) as PowerManager
wakeLock = powerManager.newWakeLock(
PowerManager.PARTIAL_WAKE_LOCK,
WAKE_LOCK_TAG
).apply {
acquire(10 * 60 * 1000L) // 10 minutes, will be renewed
}
}
private fun releaseWakeLock() {
wakeLock?.let {
if (it.isHeld) {
it.release()
}
}
wakeLock = null
}
}

View File

@@ -0,0 +1,22 @@
package wtf.ruv.paarrot
import android.content.BroadcastReceiver
import android.content.Context
import android.content.Intent
import android.os.Build
/**
* Receives BOOT_COMPLETED broadcast to restart the sync service after device reboot.
*/
class BootReceiver : BroadcastReceiver() {
override fun onReceive(context: Context, intent: Intent) {
if (intent.action == Intent.ACTION_BOOT_COMPLETED) {
val serviceIntent = Intent(context, SyncService::class.java)
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
context.startForegroundService(serviceIntent)
} else {
context.startService(serviceIntent)
}
}
}
}

View File

@@ -0,0 +1,25 @@
package wtf.ruv.paarrot
import android.content.Intent
import android.os.Build
import android.os.Bundle
import androidx.activity.enableEdgeToEdge
class MainActivity : TauriActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
enableEdgeToEdge()
super.onCreate(savedInstanceState)
// Start the foreground sync service to keep the app alive for notifications
startSyncService()
}
private fun startSyncService() {
val serviceIntent = Intent(this, SyncService::class.java)
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
startForegroundService(serviceIntent)
} else {
startService(serviceIntent)
}
}
}

View File

@@ -0,0 +1,177 @@
package wtf.ruv.paarrot
import android.app.AlarmManager
import android.app.NotificationChannel
import android.app.NotificationManager
import android.app.PendingIntent
import android.app.Service
import android.content.Context
import android.content.Intent
import android.os.Build
import android.os.Handler
import android.os.IBinder
import android.os.Looper
import android.os.PowerManager
import android.os.SystemClock
import androidx.core.app.NotificationCompat
/**
* Foreground service that keeps the app alive for background sync.
* This allows Matrix sync to continue even when the app is in the background.
*/
class SyncService : Service() {
companion object {
private const val NOTIFICATION_ID = 1
private const val CHANNEL_ID = "paarrot_sync_channel"
private const val CHANNEL_NAME = "Background Sync"
private const val WAKE_LOCK_TAG = "Paarrot:SyncWakeLock"
private const val ALARM_REQUEST_CODE = 1001
private const val KEEP_ALIVE_INTERVAL_MS = 5 * 60 * 1000L // 5 minutes
}
private var wakeLock: PowerManager.WakeLock? = null
private val handler = Handler(Looper.getMainLooper())
private val keepAliveRunnable = object : Runnable {
override fun run() {
// Re-acquire wake lock periodically to prevent it from being released
ensureWakeLock()
handler.postDelayed(this, KEEP_ALIVE_INTERVAL_MS)
}
}
override fun onBind(intent: Intent?): IBinder? = null
override fun onCreate() {
super.onCreate()
createNotificationChannel()
acquireWakeLock()
scheduleKeepAlive()
}
override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {
startForeground(NOTIFICATION_ID, createNotification())
ensureWakeLock()
return START_STICKY
}
override fun onDestroy() {
handler.removeCallbacks(keepAliveRunnable)
cancelAlarm()
releaseWakeLock()
super.onDestroy()
}
override fun onTaskRemoved(rootIntent: Intent?) {
// Restart service if app is swiped away
val restartServiceIntent = Intent(applicationContext, SyncService::class.java)
restartServiceIntent.setPackage(packageName)
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
startForegroundService(restartServiceIntent)
} else {
startService(restartServiceIntent)
}
super.onTaskRemoved(rootIntent)
}
private fun createNotificationChannel() {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
val channel = NotificationChannel(
CHANNEL_ID,
CHANNEL_NAME,
NotificationManager.IMPORTANCE_LOW
).apply {
description = "Keeps Paarrot connected for message notifications"
setShowBadge(false)
}
val notificationManager = getSystemService(NotificationManager::class.java)
notificationManager.createNotificationChannel(channel)
}
}
private fun createNotification(): android.app.Notification {
val pendingIntent = PendingIntent.getActivity(
this,
0,
Intent(this, MainActivity::class.java),
PendingIntent.FLAG_IMMUTABLE
)
return NotificationCompat.Builder(this, CHANNEL_ID)
.setContentTitle("Paarrot")
.setContentText("Connected to Matrix")
.setSmallIcon(android.R.drawable.ic_dialog_info)
.setContentIntent(pendingIntent)
.setPriority(NotificationCompat.PRIORITY_LOW)
.setOngoing(true)
.build()
}
private fun scheduleKeepAlive() {
// Use handler for periodic wake lock refresh
handler.postDelayed(keepAliveRunnable, KEEP_ALIVE_INTERVAL_MS)
// Also set up alarm as backup
scheduleAlarm()
}
private fun scheduleAlarm() {
val alarmManager = getSystemService(Context.ALARM_SERVICE) as AlarmManager
val intent = Intent(this, SyncService::class.java)
val pendingIntent = PendingIntent.getService(
this,
ALARM_REQUEST_CODE,
intent,
PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE
)
// Schedule inexact repeating alarm to restart service periodically
alarmManager.setInexactRepeating(
AlarmManager.ELAPSED_REALTIME_WAKEUP,
SystemClock.elapsedRealtime() + KEEP_ALIVE_INTERVAL_MS,
KEEP_ALIVE_INTERVAL_MS,
pendingIntent
)
}
private fun cancelAlarm() {
val alarmManager = getSystemService(Context.ALARM_SERVICE) as AlarmManager
val intent = Intent(this, SyncService::class.java)
val pendingIntent = PendingIntent.getService(
this,
ALARM_REQUEST_CODE,
intent,
PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE
)
alarmManager.cancel(pendingIntent)
}
private fun acquireWakeLock() {
val powerManager = getSystemService(Context.POWER_SERVICE) as PowerManager
wakeLock = powerManager.newWakeLock(
PowerManager.PARTIAL_WAKE_LOCK,
WAKE_LOCK_TAG
).apply {
// Acquire indefinitely - the service manages its own lifecycle
acquire()
}
}
private fun ensureWakeLock() {
wakeLock?.let {
if (!it.isHeld) {
it.acquire()
}
} ?: acquireWakeLock()
}
private fun releaseWakeLock() {
wakeLock?.let {
if (it.isHeld) {
it.release()
}
}
wakeLock = null
}
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.4 KiB

After

Width:  |  Height:  |  Size: 9.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 14 KiB

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.4 KiB

After

Width:  |  Height:  |  Size: 8.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.3 KiB

After

Width:  |  Height:  |  Size: 4.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 8.9 KiB

After

Width:  |  Height:  |  Size: 9.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.3 KiB

After

Width:  |  Height:  |  Size: 4.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.8 KiB

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 18 KiB

After

Width:  |  Height:  |  Size: 30 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.8 KiB

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 12 KiB

After

Width:  |  Height:  |  Size: 30 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 29 KiB

After

Width:  |  Height:  |  Size: 61 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 12 KiB

After

Width:  |  Height:  |  Size: 29 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 16 KiB

After

Width:  |  Height:  |  Size: 49 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 40 KiB

After

Width:  |  Height:  |  Size: 104 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 16 KiB

After

Width:  |  Height:  |  Size: 49 KiB

View File

@@ -1,6 +1,6 @@
<resources xmlns:tools="http://schemas.android.com/tools"> <resources xmlns:tools="http://schemas.android.com/tools">
<!-- Base application theme. --> <!-- Base application theme. -->
<style name="Theme.cinny" parent="Theme.MaterialComponents.DayNight.NoActionBar"> <style name="Theme.paarrot" parent="Theme.MaterialComponents.DayNight.NoActionBar">
<!-- Customize your theme here. --> <!-- Customize your theme here. -->
</style> </style>
</resources> </resources>

View File

@@ -1,4 +1,4 @@
<resources> <resources>
<string name="app_name">Cinny</string> <string name="app_name">Paarrot</string>
<string name="main_activity_title">Cinny</string> <string name="main_activity_title">Paarrot</string>
</resources> </resources>

View File

@@ -1,6 +1,6 @@
<resources xmlns:tools="http://schemas.android.com/tools"> <resources xmlns:tools="http://schemas.android.com/tools">
<!-- Base application theme. --> <!-- Base application theme. -->
<style name="Theme.cinny" parent="Theme.MaterialComponents.DayNight.NoActionBar"> <style name="Theme.paarrot" parent="Theme.MaterialComponents.DayNight.NoActionBar">
<!-- Customize your theme here. --> <!-- Customize your theme here. -->
</style> </style>
</resources> </resources>

File diff suppressed because one or more lines are too long

View File

@@ -140,70 +140,52 @@
"identifier": { "identifier": {
"anyOf": [ "anyOf": [
{ {
"description": "This permission set configures which\nshell functionality is exposed by default.\n\n#### Granted Permissions\n\nIt allows to use the `open` functionality with a reasonable\nscope pre-configured. It will allow opening `http(s)://`,\n`tel:` and `mailto:` links.\n\n#### This default permission set includes:\n\n- `allow-open`", "description": "This permission set allows opening `mailto:`, `tel:`, `https://` and `http://` urls using their default application\nas well as reveal file in directories using default file explorer\n#### This default permission set includes:\n\n- `allow-open-url`\n- `allow-reveal-item-in-dir`\n- `allow-default-urls`",
"type": "string", "type": "string",
"const": "shell:default", "const": "opener:default",
"markdownDescription": "This permission set configures which\nshell functionality is exposed by default.\n\n#### Granted Permissions\n\nIt allows to use the `open` functionality with a reasonable\nscope pre-configured. It will allow opening `http(s)://`,\n`tel:` and `mailto:` links.\n\n#### This default permission set includes:\n\n- `allow-open`" "markdownDescription": "This permission set allows opening `mailto:`, `tel:`, `https://` and `http://` urls using their default application\nas well as reveal file in directories using default file explorer\n#### This default permission set includes:\n\n- `allow-open-url`\n- `allow-reveal-item-in-dir`\n- `allow-default-urls`"
}, },
{ {
"description": "Enables the execute command without any pre-configured scope.", "description": "This enables opening `mailto:`, `tel:`, `https://` and `http://` urls using their default application.",
"type": "string", "type": "string",
"const": "shell:allow-execute", "const": "opener:allow-default-urls",
"markdownDescription": "Enables the execute command without any pre-configured scope." "markdownDescription": "This enables opening `mailto:`, `tel:`, `https://` and `http://` urls using their default application."
}, },
{ {
"description": "Enables the kill command without any pre-configured scope.", "description": "Enables the open_path command without any pre-configured scope.",
"type": "string", "type": "string",
"const": "shell:allow-kill", "const": "opener:allow-open-path",
"markdownDescription": "Enables the kill command without any pre-configured scope." "markdownDescription": "Enables the open_path command without any pre-configured scope."
}, },
{ {
"description": "Enables the open command without any pre-configured scope.", "description": "Enables the open_url command without any pre-configured scope.",
"type": "string", "type": "string",
"const": "shell:allow-open", "const": "opener:allow-open-url",
"markdownDescription": "Enables the open command without any pre-configured scope." "markdownDescription": "Enables the open_url command without any pre-configured scope."
}, },
{ {
"description": "Enables the spawn command without any pre-configured scope.", "description": "Enables the reveal_item_in_dir command without any pre-configured scope.",
"type": "string", "type": "string",
"const": "shell:allow-spawn", "const": "opener:allow-reveal-item-in-dir",
"markdownDescription": "Enables the spawn command without any pre-configured scope." "markdownDescription": "Enables the reveal_item_in_dir command without any pre-configured scope."
}, },
{ {
"description": "Enables the stdin_write command without any pre-configured scope.", "description": "Denies the open_path command without any pre-configured scope.",
"type": "string", "type": "string",
"const": "shell:allow-stdin-write", "const": "opener:deny-open-path",
"markdownDescription": "Enables the stdin_write command without any pre-configured scope." "markdownDescription": "Denies the open_path command without any pre-configured scope."
}, },
{ {
"description": "Denies the execute command without any pre-configured scope.", "description": "Denies the open_url command without any pre-configured scope.",
"type": "string", "type": "string",
"const": "shell:deny-execute", "const": "opener:deny-open-url",
"markdownDescription": "Denies the execute command without any pre-configured scope." "markdownDescription": "Denies the open_url command without any pre-configured scope."
}, },
{ {
"description": "Denies the kill command without any pre-configured scope.", "description": "Denies the reveal_item_in_dir command without any pre-configured scope.",
"type": "string", "type": "string",
"const": "shell:deny-kill", "const": "opener:deny-reveal-item-in-dir",
"markdownDescription": "Denies the kill command without any pre-configured scope." "markdownDescription": "Denies the reveal_item_in_dir command without any pre-configured scope."
},
{
"description": "Denies the open command without any pre-configured scope.",
"type": "string",
"const": "shell:deny-open",
"markdownDescription": "Denies the open command without any pre-configured scope."
},
{
"description": "Denies the spawn command without any pre-configured scope.",
"type": "string",
"const": "shell:deny-spawn",
"markdownDescription": "Denies the spawn command without any pre-configured scope."
},
{
"description": "Denies the stdin_write command without any pre-configured scope.",
"type": "string",
"const": "shell:deny-stdin-write",
"markdownDescription": "Denies the stdin_write command without any pre-configured scope."
} }
] ]
} }
@@ -213,120 +195,96 @@
"properties": { "properties": {
"allow": { "allow": {
"items": { "items": {
"title": "ShellScopeEntry", "title": "OpenerScopeEntry",
"description": "Shell scope entry.", "description": "Opener scope entry.",
"anyOf": [ "anyOf": [
{ {
"type": "object", "type": "object",
"required": [ "required": [
"cmd", "url"
"name"
], ],
"properties": { "properties": {
"args": { "app": {
"description": "The allowed arguments for the command execution.", "description": "An application to open this url with, for example: firefox.",
"allOf": [ "allOf": [
{ {
"$ref": "#/definitions/ShellScopeEntryAllowedArgs" "$ref": "#/definitions/Application"
} }
] ]
}, },
"cmd": { "url": {
"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`, `$LOG`, `$TEMP`, `$APPCONFIG`, `$APPDATA`, `$APPLOCALDATA`, `$APPCACHE`, `$APPLOG`.", "description": "A URL that can be opened by the webview when using the Opener APIs.\n\nWildcards can be used following the UNIX glob pattern.\n\nExamples:\n\n- \"https://*\" : allows all HTTPS origin\n\n- \"https://*.github.com/tauri-apps/tauri\": allows any subdomain of \"github.com\" with the \"tauri-apps/api\" path\n\n- \"https://myapi.service.com/users/*\": allows access to any URLs that begins with \"https://myapi.service.com/users/\"",
"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" "type": "string"
} }
}, }
"additionalProperties": false
}, },
{ {
"type": "object", "type": "object",
"required": [ "required": [
"name", "path"
"sidecar"
], ],
"properties": { "properties": {
"args": { "app": {
"description": "The allowed arguments for the command execution.", "description": "An application to open this path with, for example: xdg-open.",
"allOf": [ "allOf": [
{ {
"$ref": "#/definitions/ShellScopeEntryAllowedArgs" "$ref": "#/definitions/Application"
} }
] ]
}, },
"name": { "path": {
"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.", "description": "A path that can be opened by the webview when using the Opener APIs.\n\nThe pattern 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" "type": "string"
},
"sidecar": {
"description": "If this command is a sidecar command.",
"type": "boolean"
} }
}, }
"additionalProperties": false
} }
] ]
} }
}, },
"deny": { "deny": {
"items": { "items": {
"title": "ShellScopeEntry", "title": "OpenerScopeEntry",
"description": "Shell scope entry.", "description": "Opener scope entry.",
"anyOf": [ "anyOf": [
{ {
"type": "object", "type": "object",
"required": [ "required": [
"cmd", "url"
"name"
], ],
"properties": { "properties": {
"args": { "app": {
"description": "The allowed arguments for the command execution.", "description": "An application to open this url with, for example: firefox.",
"allOf": [ "allOf": [
{ {
"$ref": "#/definitions/ShellScopeEntryAllowedArgs" "$ref": "#/definitions/Application"
} }
] ]
}, },
"cmd": { "url": {
"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`, `$LOG`, `$TEMP`, `$APPCONFIG`, `$APPDATA`, `$APPLOCALDATA`, `$APPCACHE`, `$APPLOG`.", "description": "A URL that can be opened by the webview when using the Opener APIs.\n\nWildcards can be used following the UNIX glob pattern.\n\nExamples:\n\n- \"https://*\" : allows all HTTPS origin\n\n- \"https://*.github.com/tauri-apps/tauri\": allows any subdomain of \"github.com\" with the \"tauri-apps/api\" path\n\n- \"https://myapi.service.com/users/*\": allows access to any URLs that begins with \"https://myapi.service.com/users/\"",
"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" "type": "string"
} }
}, }
"additionalProperties": false
}, },
{ {
"type": "object", "type": "object",
"required": [ "required": [
"name", "path"
"sidecar"
], ],
"properties": { "properties": {
"args": { "app": {
"description": "The allowed arguments for the command execution.", "description": "An application to open this path with, for example: xdg-open.",
"allOf": [ "allOf": [
{ {
"$ref": "#/definitions/ShellScopeEntryAllowedArgs" "$ref": "#/definitions/Application"
} }
] ]
}, },
"name": { "path": {
"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.", "description": "A path that can be opened by the webview when using the Opener APIs.\n\nThe pattern 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" "type": "string"
},
"sidecar": {
"description": "If this command is a sidecar command.",
"type": "boolean"
} }
}, }
"additionalProperties": false
} }
] ]
} }
@@ -2355,112 +2313,304 @@
"markdownDescription": "Denies the unminimize command without any pre-configured scope." "markdownDescription": "Denies the unminimize command without any pre-configured scope."
}, },
{ {
"description": "This permission set configures which\nshell functionality is exposed by default.\n\n#### Granted Permissions\n\nIt allows to use the `open` functionality with a reasonable\nscope pre-configured. It will allow opening `http(s)://`,\n`tel:` and `mailto:` links.\n\n#### This default permission set includes:\n\n- `allow-open`", "description": "Allows reading the opened deep link via the get_current command\n#### This default permission set includes:\n\n- `allow-get-current`",
"type": "string", "type": "string",
"const": "shell:default", "const": "deep-link:default",
"markdownDescription": "This permission set configures which\nshell functionality is exposed by default.\n\n#### Granted Permissions\n\nIt allows to use the `open` functionality with a reasonable\nscope pre-configured. It will allow opening `http(s)://`,\n`tel:` and `mailto:` links.\n\n#### This default permission set includes:\n\n- `allow-open`" "markdownDescription": "Allows reading the opened deep link via the get_current command\n#### This default permission set includes:\n\n- `allow-get-current`"
}, },
{ {
"description": "Enables the execute command without any pre-configured scope.", "description": "Enables the get_current command without any pre-configured scope.",
"type": "string", "type": "string",
"const": "shell:allow-execute", "const": "deep-link:allow-get-current",
"markdownDescription": "Enables the execute command without any pre-configured scope." "markdownDescription": "Enables the get_current command without any pre-configured scope."
}, },
{ {
"description": "Enables the kill command without any pre-configured scope.", "description": "Enables the is_registered command without any pre-configured scope.",
"type": "string", "type": "string",
"const": "shell:allow-kill", "const": "deep-link:allow-is-registered",
"markdownDescription": "Enables the kill command without any pre-configured scope." "markdownDescription": "Enables the is_registered command without any pre-configured scope."
}, },
{ {
"description": "Enables the open command without any pre-configured scope.", "description": "Enables the register command without any pre-configured scope.",
"type": "string", "type": "string",
"const": "shell:allow-open", "const": "deep-link:allow-register",
"markdownDescription": "Enables the open command without any pre-configured scope." "markdownDescription": "Enables the register command without any pre-configured scope."
}, },
{ {
"description": "Enables the spawn command without any pre-configured scope.", "description": "Enables the unregister command without any pre-configured scope.",
"type": "string", "type": "string",
"const": "shell:allow-spawn", "const": "deep-link:allow-unregister",
"markdownDescription": "Enables the spawn command without any pre-configured scope." "markdownDescription": "Enables the unregister command without any pre-configured scope."
}, },
{ {
"description": "Enables the stdin_write command without any pre-configured scope.", "description": "Denies the get_current command without any pre-configured scope.",
"type": "string", "type": "string",
"const": "shell:allow-stdin-write", "const": "deep-link:deny-get-current",
"markdownDescription": "Enables the stdin_write command without any pre-configured scope." "markdownDescription": "Denies the get_current command without any pre-configured scope."
}, },
{ {
"description": "Denies the execute command without any pre-configured scope.", "description": "Denies the is_registered command without any pre-configured scope.",
"type": "string", "type": "string",
"const": "shell:deny-execute", "const": "deep-link:deny-is-registered",
"markdownDescription": "Denies the execute command without any pre-configured scope." "markdownDescription": "Denies the is_registered command without any pre-configured scope."
}, },
{ {
"description": "Denies the kill command without any pre-configured scope.", "description": "Denies the register command without any pre-configured scope.",
"type": "string", "type": "string",
"const": "shell:deny-kill", "const": "deep-link:deny-register",
"markdownDescription": "Denies the kill command without any pre-configured scope." "markdownDescription": "Denies the register command without any pre-configured scope."
}, },
{ {
"description": "Denies the open command without any pre-configured scope.", "description": "Denies the unregister command without any pre-configured scope.",
"type": "string", "type": "string",
"const": "shell:deny-open", "const": "deep-link:deny-unregister",
"markdownDescription": "Denies the open command without any pre-configured scope." "markdownDescription": "Denies the unregister command without any pre-configured scope."
}, },
{ {
"description": "Denies the spawn command without any pre-configured scope.", "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\n#### This default permission set includes:\n\n- `allow-is-permission-granted`\n- `allow-request-permission`\n- `allow-notify`\n- `allow-register-action-types`\n- `allow-register-listener`\n- `allow-cancel`\n- `allow-get-pending`\n- `allow-remove-active`\n- `allow-get-active`\n- `allow-check-permissions`\n- `allow-show`\n- `allow-batch`\n- `allow-list-channels`\n- `allow-delete-channel`\n- `allow-create-channel`\n- `allow-permission-state`",
"type": "string", "type": "string",
"const": "shell:deny-spawn", "const": "notification:default",
"markdownDescription": "Denies the spawn command without any pre-configured scope." "markdownDescription": "This permission set configures which\nnotification features are by default exposed.\n\n#### Granted Permissions\n\nIt allows all notification related features.\n\n\n#### This default permission set includes:\n\n- `allow-is-permission-granted`\n- `allow-request-permission`\n- `allow-notify`\n- `allow-register-action-types`\n- `allow-register-listener`\n- `allow-cancel`\n- `allow-get-pending`\n- `allow-remove-active`\n- `allow-get-active`\n- `allow-check-permissions`\n- `allow-show`\n- `allow-batch`\n- `allow-list-channels`\n- `allow-delete-channel`\n- `allow-create-channel`\n- `allow-permission-state`"
}, },
{ {
"description": "Denies the stdin_write command without any pre-configured scope.", "description": "Enables the batch command without any pre-configured scope.",
"type": "string", "type": "string",
"const": "shell:deny-stdin-write", "const": "notification:allow-batch",
"markdownDescription": "Denies the stdin_write command without any pre-configured scope." "markdownDescription": "Enables the batch command without any pre-configured scope."
}, },
{ {
"description": "This permission set configures what kind of\noperations are available from the window state plugin.\n\n#### Granted Permissions\n\nAll operations are enabled by default.\n\n\n#### This default permission set includes:\n\n- `allow-filename`\n- `allow-restore-state`\n- `allow-save-window-state`", "description": "Enables the cancel command without any pre-configured scope.",
"type": "string", "type": "string",
"const": "window-state:default", "const": "notification:allow-cancel",
"markdownDescription": "This permission set configures what kind of\noperations are available from the window state plugin.\n\n#### Granted Permissions\n\nAll operations are enabled by default.\n\n\n#### This default permission set includes:\n\n- `allow-filename`\n- `allow-restore-state`\n- `allow-save-window-state`" "markdownDescription": "Enables the cancel command without any pre-configured scope."
}, },
{ {
"description": "Enables the filename command without any pre-configured scope.", "description": "Enables the check_permissions command without any pre-configured scope.",
"type": "string", "type": "string",
"const": "window-state:allow-filename", "const": "notification:allow-check-permissions",
"markdownDescription": "Enables the filename command without any pre-configured scope." "markdownDescription": "Enables the check_permissions command without any pre-configured scope."
}, },
{ {
"description": "Enables the restore_state command without any pre-configured scope.", "description": "Enables the create_channel command without any pre-configured scope.",
"type": "string", "type": "string",
"const": "window-state:allow-restore-state", "const": "notification:allow-create-channel",
"markdownDescription": "Enables the restore_state command without any pre-configured scope." "markdownDescription": "Enables the create_channel command without any pre-configured scope."
}, },
{ {
"description": "Enables the save_window_state command without any pre-configured scope.", "description": "Enables the delete_channel command without any pre-configured scope.",
"type": "string", "type": "string",
"const": "window-state:allow-save-window-state", "const": "notification:allow-delete-channel",
"markdownDescription": "Enables the save_window_state command without any pre-configured scope." "markdownDescription": "Enables the delete_channel command without any pre-configured scope."
}, },
{ {
"description": "Denies the filename command without any pre-configured scope.", "description": "Enables the get_active command without any pre-configured scope.",
"type": "string", "type": "string",
"const": "window-state:deny-filename", "const": "notification:allow-get-active",
"markdownDescription": "Denies the filename command without any pre-configured scope." "markdownDescription": "Enables the get_active command without any pre-configured scope."
}, },
{ {
"description": "Denies the restore_state command without any pre-configured scope.", "description": "Enables the get_pending command without any pre-configured scope.",
"type": "string", "type": "string",
"const": "window-state:deny-restore-state", "const": "notification:allow-get-pending",
"markdownDescription": "Denies the restore_state command without any pre-configured scope." "markdownDescription": "Enables the get_pending command without any pre-configured scope."
}, },
{ {
"description": "Denies the save_window_state command without any pre-configured scope.", "description": "Enables the is_permission_granted command without any pre-configured scope.",
"type": "string", "type": "string",
"const": "window-state:deny-save-window-state", "const": "notification:allow-is-permission-granted",
"markdownDescription": "Denies the save_window_state command without any pre-configured scope." "markdownDescription": "Enables the is_permission_granted command without any pre-configured scope."
},
{
"description": "Enables the list_channels command without any pre-configured scope.",
"type": "string",
"const": "notification:allow-list-channels",
"markdownDescription": "Enables the list_channels command without any pre-configured scope."
},
{
"description": "Enables the notify command without any pre-configured scope.",
"type": "string",
"const": "notification:allow-notify",
"markdownDescription": "Enables the notify command without any pre-configured scope."
},
{
"description": "Enables the permission_state command without any pre-configured scope.",
"type": "string",
"const": "notification:allow-permission-state",
"markdownDescription": "Enables the permission_state command without any pre-configured scope."
},
{
"description": "Enables the register_action_types command without any pre-configured scope.",
"type": "string",
"const": "notification:allow-register-action-types",
"markdownDescription": "Enables the register_action_types command without any pre-configured scope."
},
{
"description": "Enables the register_listener command without any pre-configured scope.",
"type": "string",
"const": "notification:allow-register-listener",
"markdownDescription": "Enables the register_listener command without any pre-configured scope."
},
{
"description": "Enables the remove_active command without any pre-configured scope.",
"type": "string",
"const": "notification:allow-remove-active",
"markdownDescription": "Enables the remove_active command without any pre-configured scope."
},
{
"description": "Enables the request_permission command without any pre-configured scope.",
"type": "string",
"const": "notification:allow-request-permission",
"markdownDescription": "Enables the request_permission command without any pre-configured scope."
},
{
"description": "Enables the show command without any pre-configured scope.",
"type": "string",
"const": "notification:allow-show",
"markdownDescription": "Enables the show command without any pre-configured scope."
},
{
"description": "Denies the batch command without any pre-configured scope.",
"type": "string",
"const": "notification:deny-batch",
"markdownDescription": "Denies the batch command without any pre-configured scope."
},
{
"description": "Denies the cancel command without any pre-configured scope.",
"type": "string",
"const": "notification:deny-cancel",
"markdownDescription": "Denies the cancel command without any pre-configured scope."
},
{
"description": "Denies the check_permissions command without any pre-configured scope.",
"type": "string",
"const": "notification:deny-check-permissions",
"markdownDescription": "Denies the check_permissions command without any pre-configured scope."
},
{
"description": "Denies the create_channel command without any pre-configured scope.",
"type": "string",
"const": "notification:deny-create-channel",
"markdownDescription": "Denies the create_channel command without any pre-configured scope."
},
{
"description": "Denies the delete_channel command without any pre-configured scope.",
"type": "string",
"const": "notification:deny-delete-channel",
"markdownDescription": "Denies the delete_channel command without any pre-configured scope."
},
{
"description": "Denies the get_active command without any pre-configured scope.",
"type": "string",
"const": "notification:deny-get-active",
"markdownDescription": "Denies the get_active command without any pre-configured scope."
},
{
"description": "Denies the get_pending command without any pre-configured scope.",
"type": "string",
"const": "notification:deny-get-pending",
"markdownDescription": "Denies the get_pending command without any pre-configured scope."
},
{
"description": "Denies the is_permission_granted command without any pre-configured scope.",
"type": "string",
"const": "notification:deny-is-permission-granted",
"markdownDescription": "Denies the is_permission_granted command without any pre-configured scope."
},
{
"description": "Denies the list_channels command without any pre-configured scope.",
"type": "string",
"const": "notification:deny-list-channels",
"markdownDescription": "Denies the list_channels command without any pre-configured scope."
},
{
"description": "Denies the notify command without any pre-configured scope.",
"type": "string",
"const": "notification:deny-notify",
"markdownDescription": "Denies the notify command without any pre-configured scope."
},
{
"description": "Denies the permission_state command without any pre-configured scope.",
"type": "string",
"const": "notification:deny-permission-state",
"markdownDescription": "Denies the permission_state command without any pre-configured scope."
},
{
"description": "Denies the register_action_types command without any pre-configured scope.",
"type": "string",
"const": "notification:deny-register-action-types",
"markdownDescription": "Denies the register_action_types command without any pre-configured scope."
},
{
"description": "Denies the register_listener command without any pre-configured scope.",
"type": "string",
"const": "notification:deny-register-listener",
"markdownDescription": "Denies the register_listener command without any pre-configured scope."
},
{
"description": "Denies the remove_active command without any pre-configured scope.",
"type": "string",
"const": "notification:deny-remove-active",
"markdownDescription": "Denies the remove_active command without any pre-configured scope."
},
{
"description": "Denies the request_permission command without any pre-configured scope.",
"type": "string",
"const": "notification:deny-request-permission",
"markdownDescription": "Denies the request_permission command without any pre-configured scope."
},
{
"description": "Denies the show command without any pre-configured scope.",
"type": "string",
"const": "notification:deny-show",
"markdownDescription": "Denies the show command without any pre-configured scope."
},
{
"description": "This permission set allows opening `mailto:`, `tel:`, `https://` and `http://` urls using their default application\nas well as reveal file in directories using default file explorer\n#### This default permission set includes:\n\n- `allow-open-url`\n- `allow-reveal-item-in-dir`\n- `allow-default-urls`",
"type": "string",
"const": "opener:default",
"markdownDescription": "This permission set allows opening `mailto:`, `tel:`, `https://` and `http://` urls using their default application\nas well as reveal file in directories using default file explorer\n#### This default permission set includes:\n\n- `allow-open-url`\n- `allow-reveal-item-in-dir`\n- `allow-default-urls`"
},
{
"description": "This enables opening `mailto:`, `tel:`, `https://` and `http://` urls using their default application.",
"type": "string",
"const": "opener:allow-default-urls",
"markdownDescription": "This enables opening `mailto:`, `tel:`, `https://` and `http://` urls using their default application."
},
{
"description": "Enables the open_path command without any pre-configured scope.",
"type": "string",
"const": "opener:allow-open-path",
"markdownDescription": "Enables the open_path command without any pre-configured scope."
},
{
"description": "Enables the open_url command without any pre-configured scope.",
"type": "string",
"const": "opener:allow-open-url",
"markdownDescription": "Enables the open_url command without any pre-configured scope."
},
{
"description": "Enables the reveal_item_in_dir command without any pre-configured scope.",
"type": "string",
"const": "opener:allow-reveal-item-in-dir",
"markdownDescription": "Enables the reveal_item_in_dir command without any pre-configured scope."
},
{
"description": "Denies the open_path command without any pre-configured scope.",
"type": "string",
"const": "opener:deny-open-path",
"markdownDescription": "Denies the open_path command without any pre-configured scope."
},
{
"description": "Denies the open_url command without any pre-configured scope.",
"type": "string",
"const": "opener:deny-open-url",
"markdownDescription": "Denies the open_url command without any pre-configured scope."
},
{
"description": "Denies the reveal_item_in_dir command without any pre-configured scope.",
"type": "string",
"const": "opener:deny-reveal-item-in-dir",
"markdownDescription": "Denies the reveal_item_in_dir command without any pre-configured scope."
} }
] ]
}, },
@@ -2558,47 +2708,20 @@
} }
] ]
}, },
"ShellScopeEntryAllowedArg": { "Application": {
"description": "A command argument allowed to be executed by the webview API.", "description": "Opener scope application.",
"anyOf": [ "anyOf": [
{ {
"description": "A non-configurable argument that is passed to the command in the order it was specified.", "description": "Open in default application.",
"type": "string" "type": "null"
}, },
{ {
"description": "A variable that is set while calling the command from the webview API.", "description": "If true, allow open with any application.",
"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]: <https://docs.rs/regex/latest/regex/#syntax>",
"type": "string"
}
},
"additionalProperties": false
}
]
},
"ShellScopeEntryAllowedArgs": {
"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 [`ShellScopeEntryAllowedArg`] 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" "type": "boolean"
}, },
{ {
"description": "A specific set of [`ShellScopeEntryAllowedArg`] that are valid to call for the command configuration.", "description": "Allow specific application to open with.",
"type": "array", "type": "string"
"items": {
"$ref": "#/definitions/ShellScopeEntryAllowedArg"
}
} }
] ]
} }

View File

@@ -1 +1 @@
{} {"default":{"identifier":"default","description":"Default capability for all windows","local":true,"windows":["*"],"permissions":["core:default","opener:default","opener:allow-open-url","opener:allow-default-urls","notification:default","autostart:default"],"platforms":["linux","windows","macOS"]},"mobile":{"identifier":"mobile","description":"Default capability for mobile","local":true,"windows":["*"],"permissions":["core:default","notification:default","deep-link:default"],"platforms":["android","iOS"]}}

View File

@@ -140,70 +140,52 @@
"identifier": { "identifier": {
"anyOf": [ "anyOf": [
{ {
"description": "This permission set configures which\nshell functionality is exposed by default.\n\n#### Granted Permissions\n\nIt allows to use the `open` functionality with a reasonable\nscope pre-configured. It will allow opening `http(s)://`,\n`tel:` and `mailto:` links.\n\n#### This default permission set includes:\n\n- `allow-open`", "description": "This permission set allows opening `mailto:`, `tel:`, `https://` and `http://` urls using their default application\nas well as reveal file in directories using default file explorer\n#### This default permission set includes:\n\n- `allow-open-url`\n- `allow-reveal-item-in-dir`\n- `allow-default-urls`",
"type": "string", "type": "string",
"const": "shell:default", "const": "opener:default",
"markdownDescription": "This permission set configures which\nshell functionality is exposed by default.\n\n#### Granted Permissions\n\nIt allows to use the `open` functionality with a reasonable\nscope pre-configured. It will allow opening `http(s)://`,\n`tel:` and `mailto:` links.\n\n#### This default permission set includes:\n\n- `allow-open`" "markdownDescription": "This permission set allows opening `mailto:`, `tel:`, `https://` and `http://` urls using their default application\nas well as reveal file in directories using default file explorer\n#### This default permission set includes:\n\n- `allow-open-url`\n- `allow-reveal-item-in-dir`\n- `allow-default-urls`"
}, },
{ {
"description": "Enables the execute command without any pre-configured scope.", "description": "This enables opening `mailto:`, `tel:`, `https://` and `http://` urls using their default application.",
"type": "string", "type": "string",
"const": "shell:allow-execute", "const": "opener:allow-default-urls",
"markdownDescription": "Enables the execute command without any pre-configured scope." "markdownDescription": "This enables opening `mailto:`, `tel:`, `https://` and `http://` urls using their default application."
}, },
{ {
"description": "Enables the kill command without any pre-configured scope.", "description": "Enables the open_path command without any pre-configured scope.",
"type": "string", "type": "string",
"const": "shell:allow-kill", "const": "opener:allow-open-path",
"markdownDescription": "Enables the kill command without any pre-configured scope." "markdownDescription": "Enables the open_path command without any pre-configured scope."
}, },
{ {
"description": "Enables the open command without any pre-configured scope.", "description": "Enables the open_url command without any pre-configured scope.",
"type": "string", "type": "string",
"const": "shell:allow-open", "const": "opener:allow-open-url",
"markdownDescription": "Enables the open command without any pre-configured scope." "markdownDescription": "Enables the open_url command without any pre-configured scope."
}, },
{ {
"description": "Enables the spawn command without any pre-configured scope.", "description": "Enables the reveal_item_in_dir command without any pre-configured scope.",
"type": "string", "type": "string",
"const": "shell:allow-spawn", "const": "opener:allow-reveal-item-in-dir",
"markdownDescription": "Enables the spawn command without any pre-configured scope." "markdownDescription": "Enables the reveal_item_in_dir command without any pre-configured scope."
}, },
{ {
"description": "Enables the stdin_write command without any pre-configured scope.", "description": "Denies the open_path command without any pre-configured scope.",
"type": "string", "type": "string",
"const": "shell:allow-stdin-write", "const": "opener:deny-open-path",
"markdownDescription": "Enables the stdin_write command without any pre-configured scope." "markdownDescription": "Denies the open_path command without any pre-configured scope."
}, },
{ {
"description": "Denies the execute command without any pre-configured scope.", "description": "Denies the open_url command without any pre-configured scope.",
"type": "string", "type": "string",
"const": "shell:deny-execute", "const": "opener:deny-open-url",
"markdownDescription": "Denies the execute command without any pre-configured scope." "markdownDescription": "Denies the open_url command without any pre-configured scope."
}, },
{ {
"description": "Denies the kill command without any pre-configured scope.", "description": "Denies the reveal_item_in_dir command without any pre-configured scope.",
"type": "string", "type": "string",
"const": "shell:deny-kill", "const": "opener:deny-reveal-item-in-dir",
"markdownDescription": "Denies the kill command without any pre-configured scope." "markdownDescription": "Denies the reveal_item_in_dir command without any pre-configured scope."
},
{
"description": "Denies the open command without any pre-configured scope.",
"type": "string",
"const": "shell:deny-open",
"markdownDescription": "Denies the open command without any pre-configured scope."
},
{
"description": "Denies the spawn command without any pre-configured scope.",
"type": "string",
"const": "shell:deny-spawn",
"markdownDescription": "Denies the spawn command without any pre-configured scope."
},
{
"description": "Denies the stdin_write command without any pre-configured scope.",
"type": "string",
"const": "shell:deny-stdin-write",
"markdownDescription": "Denies the stdin_write command without any pre-configured scope."
} }
] ]
} }
@@ -213,120 +195,96 @@
"properties": { "properties": {
"allow": { "allow": {
"items": { "items": {
"title": "ShellScopeEntry", "title": "OpenerScopeEntry",
"description": "Shell scope entry.", "description": "Opener scope entry.",
"anyOf": [ "anyOf": [
{ {
"type": "object", "type": "object",
"required": [ "required": [
"cmd", "url"
"name"
], ],
"properties": { "properties": {
"args": { "app": {
"description": "The allowed arguments for the command execution.", "description": "An application to open this url with, for example: firefox.",
"allOf": [ "allOf": [
{ {
"$ref": "#/definitions/ShellScopeEntryAllowedArgs" "$ref": "#/definitions/Application"
} }
] ]
}, },
"cmd": { "url": {
"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`, `$LOG`, `$TEMP`, `$APPCONFIG`, `$APPDATA`, `$APPLOCALDATA`, `$APPCACHE`, `$APPLOG`.", "description": "A URL that can be opened by the webview when using the Opener APIs.\n\nWildcards can be used following the UNIX glob pattern.\n\nExamples:\n\n- \"https://*\" : allows all HTTPS origin\n\n- \"https://*.github.com/tauri-apps/tauri\": allows any subdomain of \"github.com\" with the \"tauri-apps/api\" path\n\n- \"https://myapi.service.com/users/*\": allows access to any URLs that begins with \"https://myapi.service.com/users/\"",
"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" "type": "string"
} }
}, }
"additionalProperties": false
}, },
{ {
"type": "object", "type": "object",
"required": [ "required": [
"name", "path"
"sidecar"
], ],
"properties": { "properties": {
"args": { "app": {
"description": "The allowed arguments for the command execution.", "description": "An application to open this path with, for example: xdg-open.",
"allOf": [ "allOf": [
{ {
"$ref": "#/definitions/ShellScopeEntryAllowedArgs" "$ref": "#/definitions/Application"
} }
] ]
}, },
"name": { "path": {
"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.", "description": "A path that can be opened by the webview when using the Opener APIs.\n\nThe pattern 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" "type": "string"
},
"sidecar": {
"description": "If this command is a sidecar command.",
"type": "boolean"
} }
}, }
"additionalProperties": false
} }
] ]
} }
}, },
"deny": { "deny": {
"items": { "items": {
"title": "ShellScopeEntry", "title": "OpenerScopeEntry",
"description": "Shell scope entry.", "description": "Opener scope entry.",
"anyOf": [ "anyOf": [
{ {
"type": "object", "type": "object",
"required": [ "required": [
"cmd", "url"
"name"
], ],
"properties": { "properties": {
"args": { "app": {
"description": "The allowed arguments for the command execution.", "description": "An application to open this url with, for example: firefox.",
"allOf": [ "allOf": [
{ {
"$ref": "#/definitions/ShellScopeEntryAllowedArgs" "$ref": "#/definitions/Application"
} }
] ]
}, },
"cmd": { "url": {
"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`, `$LOG`, `$TEMP`, `$APPCONFIG`, `$APPDATA`, `$APPLOCALDATA`, `$APPCACHE`, `$APPLOG`.", "description": "A URL that can be opened by the webview when using the Opener APIs.\n\nWildcards can be used following the UNIX glob pattern.\n\nExamples:\n\n- \"https://*\" : allows all HTTPS origin\n\n- \"https://*.github.com/tauri-apps/tauri\": allows any subdomain of \"github.com\" with the \"tauri-apps/api\" path\n\n- \"https://myapi.service.com/users/*\": allows access to any URLs that begins with \"https://myapi.service.com/users/\"",
"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" "type": "string"
} }
}, }
"additionalProperties": false
}, },
{ {
"type": "object", "type": "object",
"required": [ "required": [
"name", "path"
"sidecar"
], ],
"properties": { "properties": {
"args": { "app": {
"description": "The allowed arguments for the command execution.", "description": "An application to open this path with, for example: xdg-open.",
"allOf": [ "allOf": [
{ {
"$ref": "#/definitions/ShellScopeEntryAllowedArgs" "$ref": "#/definitions/Application"
} }
] ]
}, },
"name": { "path": {
"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.", "description": "A path that can be opened by the webview when using the Opener APIs.\n\nThe pattern 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" "type": "string"
},
"sidecar": {
"description": "If this command is a sidecar command.",
"type": "boolean"
} }
}, }
"additionalProperties": false
} }
] ]
} }
@@ -386,6 +344,48 @@
"Identifier": { "Identifier": {
"description": "Permission identifier", "description": "Permission identifier",
"oneOf": [ "oneOf": [
{
"description": "This permission set configures if your\napplication can enable or disable auto\nstarting the application on boot.\n\n#### Granted Permissions\n\nIt allows all to check, enable and\ndisable the automatic start on boot.\n\n\n#### This default permission set includes:\n\n- `allow-enable`\n- `allow-disable`\n- `allow-is-enabled`",
"type": "string",
"const": "autostart:default",
"markdownDescription": "This permission set configures if your\napplication can enable or disable auto\nstarting the application on boot.\n\n#### Granted Permissions\n\nIt allows all to check, enable and\ndisable the automatic start on boot.\n\n\n#### This default permission set includes:\n\n- `allow-enable`\n- `allow-disable`\n- `allow-is-enabled`"
},
{
"description": "Enables the disable command without any pre-configured scope.",
"type": "string",
"const": "autostart:allow-disable",
"markdownDescription": "Enables the disable command without any pre-configured scope."
},
{
"description": "Enables the enable command without any pre-configured scope.",
"type": "string",
"const": "autostart:allow-enable",
"markdownDescription": "Enables the enable command without any pre-configured scope."
},
{
"description": "Enables the is_enabled command without any pre-configured scope.",
"type": "string",
"const": "autostart:allow-is-enabled",
"markdownDescription": "Enables the is_enabled command without any pre-configured scope."
},
{
"description": "Denies the disable command without any pre-configured scope.",
"type": "string",
"const": "autostart:deny-disable",
"markdownDescription": "Denies the disable command without any pre-configured scope."
},
{
"description": "Denies the enable command without any pre-configured scope.",
"type": "string",
"const": "autostart:deny-enable",
"markdownDescription": "Denies the enable command without any pre-configured scope."
},
{
"description": "Denies the is_enabled command without any pre-configured scope.",
"type": "string",
"const": "autostart:deny-is-enabled",
"markdownDescription": "Denies the is_enabled command without any pre-configured scope."
},
{ {
"description": "Default core plugins set.\n#### This default permission set includes:\n\n- `core:path:default`\n- `core:event:default`\n- `core:window:default`\n- `core:webview:default`\n- `core:app:default`\n- `core:image:default`\n- `core:resources:default`\n- `core:menu:default`\n- `core:tray:default`", "description": "Default core plugins set.\n#### This default permission set includes:\n\n- `core:path:default`\n- `core:event:default`\n- `core:window:default`\n- `core:webview:default`\n- `core:app:default`\n- `core:image:default`\n- `core:resources:default`\n- `core:menu:default`\n- `core:tray:default`",
"type": "string", "type": "string",
@@ -2355,70 +2355,304 @@
"markdownDescription": "Denies the unminimize command without any pre-configured scope." "markdownDescription": "Denies the unminimize command without any pre-configured scope."
}, },
{ {
"description": "This permission set configures which\nshell functionality is exposed by default.\n\n#### Granted Permissions\n\nIt allows to use the `open` functionality with a reasonable\nscope pre-configured. It will allow opening `http(s)://`,\n`tel:` and `mailto:` links.\n\n#### This default permission set includes:\n\n- `allow-open`", "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\n#### This default permission set includes:\n\n- `allow-is-permission-granted`\n- `allow-request-permission`\n- `allow-notify`\n- `allow-register-action-types`\n- `allow-register-listener`\n- `allow-cancel`\n- `allow-get-pending`\n- `allow-remove-active`\n- `allow-get-active`\n- `allow-check-permissions`\n- `allow-show`\n- `allow-batch`\n- `allow-list-channels`\n- `allow-delete-channel`\n- `allow-create-channel`\n- `allow-permission-state`",
"type": "string", "type": "string",
"const": "shell:default", "const": "notification:default",
"markdownDescription": "This permission set configures which\nshell functionality is exposed by default.\n\n#### Granted Permissions\n\nIt allows to use the `open` functionality with a reasonable\nscope pre-configured. It will allow opening `http(s)://`,\n`tel:` and `mailto:` links.\n\n#### This default permission set includes:\n\n- `allow-open`" "markdownDescription": "This permission set configures which\nnotification features are by default exposed.\n\n#### Granted Permissions\n\nIt allows all notification related features.\n\n\n#### This default permission set includes:\n\n- `allow-is-permission-granted`\n- `allow-request-permission`\n- `allow-notify`\n- `allow-register-action-types`\n- `allow-register-listener`\n- `allow-cancel`\n- `allow-get-pending`\n- `allow-remove-active`\n- `allow-get-active`\n- `allow-check-permissions`\n- `allow-show`\n- `allow-batch`\n- `allow-list-channels`\n- `allow-delete-channel`\n- `allow-create-channel`\n- `allow-permission-state`"
}, },
{ {
"description": "Enables the execute command without any pre-configured scope.", "description": "Enables the batch command without any pre-configured scope.",
"type": "string", "type": "string",
"const": "shell:allow-execute", "const": "notification:allow-batch",
"markdownDescription": "Enables the execute command without any pre-configured scope." "markdownDescription": "Enables the batch command without any pre-configured scope."
}, },
{ {
"description": "Enables the kill command without any pre-configured scope.", "description": "Enables the cancel command without any pre-configured scope.",
"type": "string", "type": "string",
"const": "shell:allow-kill", "const": "notification:allow-cancel",
"markdownDescription": "Enables the kill command without any pre-configured scope." "markdownDescription": "Enables the cancel command without any pre-configured scope."
}, },
{ {
"description": "Enables the open command without any pre-configured scope.", "description": "Enables the check_permissions command without any pre-configured scope.",
"type": "string", "type": "string",
"const": "shell:allow-open", "const": "notification:allow-check-permissions",
"markdownDescription": "Enables the open command without any pre-configured scope." "markdownDescription": "Enables the check_permissions command without any pre-configured scope."
}, },
{ {
"description": "Enables the spawn command without any pre-configured scope.", "description": "Enables the create_channel command without any pre-configured scope.",
"type": "string", "type": "string",
"const": "shell:allow-spawn", "const": "notification:allow-create-channel",
"markdownDescription": "Enables the spawn command without any pre-configured scope." "markdownDescription": "Enables the create_channel command without any pre-configured scope."
}, },
{ {
"description": "Enables the stdin_write command without any pre-configured scope.", "description": "Enables the delete_channel command without any pre-configured scope.",
"type": "string", "type": "string",
"const": "shell:allow-stdin-write", "const": "notification:allow-delete-channel",
"markdownDescription": "Enables the stdin_write command without any pre-configured scope." "markdownDescription": "Enables the delete_channel command without any pre-configured scope."
}, },
{ {
"description": "Denies the execute command without any pre-configured scope.", "description": "Enables the get_active command without any pre-configured scope.",
"type": "string", "type": "string",
"const": "shell:deny-execute", "const": "notification:allow-get-active",
"markdownDescription": "Denies the execute command without any pre-configured scope." "markdownDescription": "Enables the get_active command without any pre-configured scope."
}, },
{ {
"description": "Denies the kill command without any pre-configured scope.", "description": "Enables the get_pending command without any pre-configured scope.",
"type": "string", "type": "string",
"const": "shell:deny-kill", "const": "notification:allow-get-pending",
"markdownDescription": "Denies the kill command without any pre-configured scope." "markdownDescription": "Enables the get_pending command without any pre-configured scope."
}, },
{ {
"description": "Denies the open command without any pre-configured scope.", "description": "Enables the is_permission_granted command without any pre-configured scope.",
"type": "string", "type": "string",
"const": "shell:deny-open", "const": "notification:allow-is-permission-granted",
"markdownDescription": "Denies the open command without any pre-configured scope." "markdownDescription": "Enables the is_permission_granted command without any pre-configured scope."
}, },
{ {
"description": "Denies the spawn command without any pre-configured scope.", "description": "Enables the list_channels command without any pre-configured scope.",
"type": "string", "type": "string",
"const": "shell:deny-spawn", "const": "notification:allow-list-channels",
"markdownDescription": "Denies the spawn command without any pre-configured scope." "markdownDescription": "Enables the list_channels command without any pre-configured scope."
}, },
{ {
"description": "Denies the stdin_write command without any pre-configured scope.", "description": "Enables the notify command without any pre-configured scope.",
"type": "string", "type": "string",
"const": "shell:deny-stdin-write", "const": "notification:allow-notify",
"markdownDescription": "Denies the stdin_write command without any pre-configured scope." "markdownDescription": "Enables the notify command without any pre-configured scope."
},
{
"description": "Enables the permission_state command without any pre-configured scope.",
"type": "string",
"const": "notification:allow-permission-state",
"markdownDescription": "Enables the permission_state command without any pre-configured scope."
},
{
"description": "Enables the register_action_types command without any pre-configured scope.",
"type": "string",
"const": "notification:allow-register-action-types",
"markdownDescription": "Enables the register_action_types command without any pre-configured scope."
},
{
"description": "Enables the register_listener command without any pre-configured scope.",
"type": "string",
"const": "notification:allow-register-listener",
"markdownDescription": "Enables the register_listener command without any pre-configured scope."
},
{
"description": "Enables the remove_active command without any pre-configured scope.",
"type": "string",
"const": "notification:allow-remove-active",
"markdownDescription": "Enables the remove_active command without any pre-configured scope."
},
{
"description": "Enables the request_permission command without any pre-configured scope.",
"type": "string",
"const": "notification:allow-request-permission",
"markdownDescription": "Enables the request_permission command without any pre-configured scope."
},
{
"description": "Enables the show command without any pre-configured scope.",
"type": "string",
"const": "notification:allow-show",
"markdownDescription": "Enables the show command without any pre-configured scope."
},
{
"description": "Denies the batch command without any pre-configured scope.",
"type": "string",
"const": "notification:deny-batch",
"markdownDescription": "Denies the batch command without any pre-configured scope."
},
{
"description": "Denies the cancel command without any pre-configured scope.",
"type": "string",
"const": "notification:deny-cancel",
"markdownDescription": "Denies the cancel command without any pre-configured scope."
},
{
"description": "Denies the check_permissions command without any pre-configured scope.",
"type": "string",
"const": "notification:deny-check-permissions",
"markdownDescription": "Denies the check_permissions command without any pre-configured scope."
},
{
"description": "Denies the create_channel command without any pre-configured scope.",
"type": "string",
"const": "notification:deny-create-channel",
"markdownDescription": "Denies the create_channel command without any pre-configured scope."
},
{
"description": "Denies the delete_channel command without any pre-configured scope.",
"type": "string",
"const": "notification:deny-delete-channel",
"markdownDescription": "Denies the delete_channel command without any pre-configured scope."
},
{
"description": "Denies the get_active command without any pre-configured scope.",
"type": "string",
"const": "notification:deny-get-active",
"markdownDescription": "Denies the get_active command without any pre-configured scope."
},
{
"description": "Denies the get_pending command without any pre-configured scope.",
"type": "string",
"const": "notification:deny-get-pending",
"markdownDescription": "Denies the get_pending command without any pre-configured scope."
},
{
"description": "Denies the is_permission_granted command without any pre-configured scope.",
"type": "string",
"const": "notification:deny-is-permission-granted",
"markdownDescription": "Denies the is_permission_granted command without any pre-configured scope."
},
{
"description": "Denies the list_channels command without any pre-configured scope.",
"type": "string",
"const": "notification:deny-list-channels",
"markdownDescription": "Denies the list_channels command without any pre-configured scope."
},
{
"description": "Denies the notify command without any pre-configured scope.",
"type": "string",
"const": "notification:deny-notify",
"markdownDescription": "Denies the notify command without any pre-configured scope."
},
{
"description": "Denies the permission_state command without any pre-configured scope.",
"type": "string",
"const": "notification:deny-permission-state",
"markdownDescription": "Denies the permission_state command without any pre-configured scope."
},
{
"description": "Denies the register_action_types command without any pre-configured scope.",
"type": "string",
"const": "notification:deny-register-action-types",
"markdownDescription": "Denies the register_action_types command without any pre-configured scope."
},
{
"description": "Denies the register_listener command without any pre-configured scope.",
"type": "string",
"const": "notification:deny-register-listener",
"markdownDescription": "Denies the register_listener command without any pre-configured scope."
},
{
"description": "Denies the remove_active command without any pre-configured scope.",
"type": "string",
"const": "notification:deny-remove-active",
"markdownDescription": "Denies the remove_active command without any pre-configured scope."
},
{
"description": "Denies the request_permission command without any pre-configured scope.",
"type": "string",
"const": "notification:deny-request-permission",
"markdownDescription": "Denies the request_permission command without any pre-configured scope."
},
{
"description": "Denies the show command without any pre-configured scope.",
"type": "string",
"const": "notification:deny-show",
"markdownDescription": "Denies the show command without any pre-configured scope."
},
{
"description": "This permission set allows opening `mailto:`, `tel:`, `https://` and `http://` urls using their default application\nas well as reveal file in directories using default file explorer\n#### This default permission set includes:\n\n- `allow-open-url`\n- `allow-reveal-item-in-dir`\n- `allow-default-urls`",
"type": "string",
"const": "opener:default",
"markdownDescription": "This permission set allows opening `mailto:`, `tel:`, `https://` and `http://` urls using their default application\nas well as reveal file in directories using default file explorer\n#### This default permission set includes:\n\n- `allow-open-url`\n- `allow-reveal-item-in-dir`\n- `allow-default-urls`"
},
{
"description": "This enables opening `mailto:`, `tel:`, `https://` and `http://` urls using their default application.",
"type": "string",
"const": "opener:allow-default-urls",
"markdownDescription": "This enables opening `mailto:`, `tel:`, `https://` and `http://` urls using their default application."
},
{
"description": "Enables the open_path command without any pre-configured scope.",
"type": "string",
"const": "opener:allow-open-path",
"markdownDescription": "Enables the open_path command without any pre-configured scope."
},
{
"description": "Enables the open_url command without any pre-configured scope.",
"type": "string",
"const": "opener:allow-open-url",
"markdownDescription": "Enables the open_url command without any pre-configured scope."
},
{
"description": "Enables the reveal_item_in_dir command without any pre-configured scope.",
"type": "string",
"const": "opener:allow-reveal-item-in-dir",
"markdownDescription": "Enables the reveal_item_in_dir command without any pre-configured scope."
},
{
"description": "Denies the open_path command without any pre-configured scope.",
"type": "string",
"const": "opener:deny-open-path",
"markdownDescription": "Denies the open_path command without any pre-configured scope."
},
{
"description": "Denies the open_url command without any pre-configured scope.",
"type": "string",
"const": "opener:deny-open-url",
"markdownDescription": "Denies the open_url command without any pre-configured scope."
},
{
"description": "Denies the reveal_item_in_dir command without any pre-configured scope.",
"type": "string",
"const": "opener:deny-reveal-item-in-dir",
"markdownDescription": "Denies the reveal_item_in_dir command without any pre-configured scope."
},
{
"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\n#### This default permission set includes:\n\n- `allow-check`\n- `allow-download`\n- `allow-install`\n- `allow-download-and-install`",
"type": "string",
"const": "updater:default",
"markdownDescription": "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\n#### This default permission set includes:\n\n- `allow-check`\n- `allow-download`\n- `allow-install`\n- `allow-download-and-install`"
},
{
"description": "Enables the check command without any pre-configured scope.",
"type": "string",
"const": "updater:allow-check",
"markdownDescription": "Enables the check command without any pre-configured scope."
},
{
"description": "Enables the download command without any pre-configured scope.",
"type": "string",
"const": "updater:allow-download",
"markdownDescription": "Enables the download command without any pre-configured scope."
},
{
"description": "Enables the download_and_install command without any pre-configured scope.",
"type": "string",
"const": "updater:allow-download-and-install",
"markdownDescription": "Enables the download_and_install command without any pre-configured scope."
},
{
"description": "Enables the install command without any pre-configured scope.",
"type": "string",
"const": "updater:allow-install",
"markdownDescription": "Enables the install command without any pre-configured scope."
},
{
"description": "Denies the check command without any pre-configured scope.",
"type": "string",
"const": "updater:deny-check",
"markdownDescription": "Denies the check command without any pre-configured scope."
},
{
"description": "Denies the download command without any pre-configured scope.",
"type": "string",
"const": "updater:deny-download",
"markdownDescription": "Denies the download command without any pre-configured scope."
},
{
"description": "Denies the download_and_install command without any pre-configured scope.",
"type": "string",
"const": "updater:deny-download-and-install",
"markdownDescription": "Denies the download_and_install command without any pre-configured scope."
},
{
"description": "Denies the install command without any pre-configured scope.",
"type": "string",
"const": "updater:deny-install",
"markdownDescription": "Denies the install command without any pre-configured scope."
}, },
{ {
"description": "This permission set configures what kind of\noperations are available from the window state plugin.\n\n#### Granted Permissions\n\nAll operations are enabled by default.\n\n\n#### This default permission set includes:\n\n- `allow-filename`\n- `allow-restore-state`\n- `allow-save-window-state`", "description": "This permission set configures what kind of\noperations are available from the window state plugin.\n\n#### Granted Permissions\n\nAll operations are enabled by default.\n\n\n#### This default permission set includes:\n\n- `allow-filename`\n- `allow-restore-state`\n- `allow-save-window-state`",
@@ -2558,47 +2792,20 @@
} }
] ]
}, },
"ShellScopeEntryAllowedArg": { "Application": {
"description": "A command argument allowed to be executed by the webview API.", "description": "Opener scope application.",
"anyOf": [ "anyOf": [
{ {
"description": "A non-configurable argument that is passed to the command in the order it was specified.", "description": "Open in default application.",
"type": "string" "type": "null"
}, },
{ {
"description": "A variable that is set while calling the command from the webview API.", "description": "If true, allow open with any application.",
"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]: <https://docs.rs/regex/latest/regex/#syntax>",
"type": "string"
}
},
"additionalProperties": false
}
]
},
"ShellScopeEntryAllowedArgs": {
"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 [`ShellScopeEntryAllowedArg`] 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" "type": "boolean"
}, },
{ {
"description": "A specific set of [`ShellScopeEntryAllowedArg`] that are valid to call for the command configuration.", "description": "Allow specific application to open with.",
"type": "array", "type": "string"
"items": {
"$ref": "#/definitions/ShellScopeEntryAllowedArg"
}
} }
] ]
} }

View File

@@ -140,70 +140,52 @@
"identifier": { "identifier": {
"anyOf": [ "anyOf": [
{ {
"description": "This permission set configures which\nshell functionality is exposed by default.\n\n#### Granted Permissions\n\nIt allows to use the `open` functionality with a reasonable\nscope pre-configured. It will allow opening `http(s)://`,\n`tel:` and `mailto:` links.\n\n#### This default permission set includes:\n\n- `allow-open`", "description": "This permission set allows opening `mailto:`, `tel:`, `https://` and `http://` urls using their default application\nas well as reveal file in directories using default file explorer\n#### This default permission set includes:\n\n- `allow-open-url`\n- `allow-reveal-item-in-dir`\n- `allow-default-urls`",
"type": "string", "type": "string",
"const": "shell:default", "const": "opener:default",
"markdownDescription": "This permission set configures which\nshell functionality is exposed by default.\n\n#### Granted Permissions\n\nIt allows to use the `open` functionality with a reasonable\nscope pre-configured. It will allow opening `http(s)://`,\n`tel:` and `mailto:` links.\n\n#### This default permission set includes:\n\n- `allow-open`" "markdownDescription": "This permission set allows opening `mailto:`, `tel:`, `https://` and `http://` urls using their default application\nas well as reveal file in directories using default file explorer\n#### This default permission set includes:\n\n- `allow-open-url`\n- `allow-reveal-item-in-dir`\n- `allow-default-urls`"
}, },
{ {
"description": "Enables the execute command without any pre-configured scope.", "description": "This enables opening `mailto:`, `tel:`, `https://` and `http://` urls using their default application.",
"type": "string", "type": "string",
"const": "shell:allow-execute", "const": "opener:allow-default-urls",
"markdownDescription": "Enables the execute command without any pre-configured scope." "markdownDescription": "This enables opening `mailto:`, `tel:`, `https://` and `http://` urls using their default application."
}, },
{ {
"description": "Enables the kill command without any pre-configured scope.", "description": "Enables the open_path command without any pre-configured scope.",
"type": "string", "type": "string",
"const": "shell:allow-kill", "const": "opener:allow-open-path",
"markdownDescription": "Enables the kill command without any pre-configured scope." "markdownDescription": "Enables the open_path command without any pre-configured scope."
}, },
{ {
"description": "Enables the open command without any pre-configured scope.", "description": "Enables the open_url command without any pre-configured scope.",
"type": "string", "type": "string",
"const": "shell:allow-open", "const": "opener:allow-open-url",
"markdownDescription": "Enables the open command without any pre-configured scope." "markdownDescription": "Enables the open_url command without any pre-configured scope."
}, },
{ {
"description": "Enables the spawn command without any pre-configured scope.", "description": "Enables the reveal_item_in_dir command without any pre-configured scope.",
"type": "string", "type": "string",
"const": "shell:allow-spawn", "const": "opener:allow-reveal-item-in-dir",
"markdownDescription": "Enables the spawn command without any pre-configured scope." "markdownDescription": "Enables the reveal_item_in_dir command without any pre-configured scope."
}, },
{ {
"description": "Enables the stdin_write command without any pre-configured scope.", "description": "Denies the open_path command without any pre-configured scope.",
"type": "string", "type": "string",
"const": "shell:allow-stdin-write", "const": "opener:deny-open-path",
"markdownDescription": "Enables the stdin_write command without any pre-configured scope." "markdownDescription": "Denies the open_path command without any pre-configured scope."
}, },
{ {
"description": "Denies the execute command without any pre-configured scope.", "description": "Denies the open_url command without any pre-configured scope.",
"type": "string", "type": "string",
"const": "shell:deny-execute", "const": "opener:deny-open-url",
"markdownDescription": "Denies the execute command without any pre-configured scope." "markdownDescription": "Denies the open_url command without any pre-configured scope."
}, },
{ {
"description": "Denies the kill command without any pre-configured scope.", "description": "Denies the reveal_item_in_dir command without any pre-configured scope.",
"type": "string", "type": "string",
"const": "shell:deny-kill", "const": "opener:deny-reveal-item-in-dir",
"markdownDescription": "Denies the kill command without any pre-configured scope." "markdownDescription": "Denies the reveal_item_in_dir command without any pre-configured scope."
},
{
"description": "Denies the open command without any pre-configured scope.",
"type": "string",
"const": "shell:deny-open",
"markdownDescription": "Denies the open command without any pre-configured scope."
},
{
"description": "Denies the spawn command without any pre-configured scope.",
"type": "string",
"const": "shell:deny-spawn",
"markdownDescription": "Denies the spawn command without any pre-configured scope."
},
{
"description": "Denies the stdin_write command without any pre-configured scope.",
"type": "string",
"const": "shell:deny-stdin-write",
"markdownDescription": "Denies the stdin_write command without any pre-configured scope."
} }
] ]
} }
@@ -213,120 +195,96 @@
"properties": { "properties": {
"allow": { "allow": {
"items": { "items": {
"title": "ShellScopeEntry", "title": "OpenerScopeEntry",
"description": "Shell scope entry.", "description": "Opener scope entry.",
"anyOf": [ "anyOf": [
{ {
"type": "object", "type": "object",
"required": [ "required": [
"cmd", "url"
"name"
], ],
"properties": { "properties": {
"args": { "app": {
"description": "The allowed arguments for the command execution.", "description": "An application to open this url with, for example: firefox.",
"allOf": [ "allOf": [
{ {
"$ref": "#/definitions/ShellScopeEntryAllowedArgs" "$ref": "#/definitions/Application"
} }
] ]
}, },
"cmd": { "url": {
"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`, `$LOG`, `$TEMP`, `$APPCONFIG`, `$APPDATA`, `$APPLOCALDATA`, `$APPCACHE`, `$APPLOG`.", "description": "A URL that can be opened by the webview when using the Opener APIs.\n\nWildcards can be used following the UNIX glob pattern.\n\nExamples:\n\n- \"https://*\" : allows all HTTPS origin\n\n- \"https://*.github.com/tauri-apps/tauri\": allows any subdomain of \"github.com\" with the \"tauri-apps/api\" path\n\n- \"https://myapi.service.com/users/*\": allows access to any URLs that begins with \"https://myapi.service.com/users/\"",
"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" "type": "string"
} }
}, }
"additionalProperties": false
}, },
{ {
"type": "object", "type": "object",
"required": [ "required": [
"name", "path"
"sidecar"
], ],
"properties": { "properties": {
"args": { "app": {
"description": "The allowed arguments for the command execution.", "description": "An application to open this path with, for example: xdg-open.",
"allOf": [ "allOf": [
{ {
"$ref": "#/definitions/ShellScopeEntryAllowedArgs" "$ref": "#/definitions/Application"
} }
] ]
}, },
"name": { "path": {
"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.", "description": "A path that can be opened by the webview when using the Opener APIs.\n\nThe pattern 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" "type": "string"
},
"sidecar": {
"description": "If this command is a sidecar command.",
"type": "boolean"
} }
}, }
"additionalProperties": false
} }
] ]
} }
}, },
"deny": { "deny": {
"items": { "items": {
"title": "ShellScopeEntry", "title": "OpenerScopeEntry",
"description": "Shell scope entry.", "description": "Opener scope entry.",
"anyOf": [ "anyOf": [
{ {
"type": "object", "type": "object",
"required": [ "required": [
"cmd", "url"
"name"
], ],
"properties": { "properties": {
"args": { "app": {
"description": "The allowed arguments for the command execution.", "description": "An application to open this url with, for example: firefox.",
"allOf": [ "allOf": [
{ {
"$ref": "#/definitions/ShellScopeEntryAllowedArgs" "$ref": "#/definitions/Application"
} }
] ]
}, },
"cmd": { "url": {
"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`, `$LOG`, `$TEMP`, `$APPCONFIG`, `$APPDATA`, `$APPLOCALDATA`, `$APPCACHE`, `$APPLOG`.", "description": "A URL that can be opened by the webview when using the Opener APIs.\n\nWildcards can be used following the UNIX glob pattern.\n\nExamples:\n\n- \"https://*\" : allows all HTTPS origin\n\n- \"https://*.github.com/tauri-apps/tauri\": allows any subdomain of \"github.com\" with the \"tauri-apps/api\" path\n\n- \"https://myapi.service.com/users/*\": allows access to any URLs that begins with \"https://myapi.service.com/users/\"",
"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" "type": "string"
} }
}, }
"additionalProperties": false
}, },
{ {
"type": "object", "type": "object",
"required": [ "required": [
"name", "path"
"sidecar"
], ],
"properties": { "properties": {
"args": { "app": {
"description": "The allowed arguments for the command execution.", "description": "An application to open this path with, for example: xdg-open.",
"allOf": [ "allOf": [
{ {
"$ref": "#/definitions/ShellScopeEntryAllowedArgs" "$ref": "#/definitions/Application"
} }
] ]
}, },
"name": { "path": {
"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.", "description": "A path that can be opened by the webview when using the Opener APIs.\n\nThe pattern 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" "type": "string"
},
"sidecar": {
"description": "If this command is a sidecar command.",
"type": "boolean"
} }
}, }
"additionalProperties": false
} }
] ]
} }
@@ -2355,112 +2313,304 @@
"markdownDescription": "Denies the unminimize command without any pre-configured scope." "markdownDescription": "Denies the unminimize command without any pre-configured scope."
}, },
{ {
"description": "This permission set configures which\nshell functionality is exposed by default.\n\n#### Granted Permissions\n\nIt allows to use the `open` functionality with a reasonable\nscope pre-configured. It will allow opening `http(s)://`,\n`tel:` and `mailto:` links.\n\n#### This default permission set includes:\n\n- `allow-open`", "description": "Allows reading the opened deep link via the get_current command\n#### This default permission set includes:\n\n- `allow-get-current`",
"type": "string", "type": "string",
"const": "shell:default", "const": "deep-link:default",
"markdownDescription": "This permission set configures which\nshell functionality is exposed by default.\n\n#### Granted Permissions\n\nIt allows to use the `open` functionality with a reasonable\nscope pre-configured. It will allow opening `http(s)://`,\n`tel:` and `mailto:` links.\n\n#### This default permission set includes:\n\n- `allow-open`" "markdownDescription": "Allows reading the opened deep link via the get_current command\n#### This default permission set includes:\n\n- `allow-get-current`"
}, },
{ {
"description": "Enables the execute command without any pre-configured scope.", "description": "Enables the get_current command without any pre-configured scope.",
"type": "string", "type": "string",
"const": "shell:allow-execute", "const": "deep-link:allow-get-current",
"markdownDescription": "Enables the execute command without any pre-configured scope." "markdownDescription": "Enables the get_current command without any pre-configured scope."
}, },
{ {
"description": "Enables the kill command without any pre-configured scope.", "description": "Enables the is_registered command without any pre-configured scope.",
"type": "string", "type": "string",
"const": "shell:allow-kill", "const": "deep-link:allow-is-registered",
"markdownDescription": "Enables the kill command without any pre-configured scope." "markdownDescription": "Enables the is_registered command without any pre-configured scope."
}, },
{ {
"description": "Enables the open command without any pre-configured scope.", "description": "Enables the register command without any pre-configured scope.",
"type": "string", "type": "string",
"const": "shell:allow-open", "const": "deep-link:allow-register",
"markdownDescription": "Enables the open command without any pre-configured scope." "markdownDescription": "Enables the register command without any pre-configured scope."
}, },
{ {
"description": "Enables the spawn command without any pre-configured scope.", "description": "Enables the unregister command without any pre-configured scope.",
"type": "string", "type": "string",
"const": "shell:allow-spawn", "const": "deep-link:allow-unregister",
"markdownDescription": "Enables the spawn command without any pre-configured scope." "markdownDescription": "Enables the unregister command without any pre-configured scope."
}, },
{ {
"description": "Enables the stdin_write command without any pre-configured scope.", "description": "Denies the get_current command without any pre-configured scope.",
"type": "string", "type": "string",
"const": "shell:allow-stdin-write", "const": "deep-link:deny-get-current",
"markdownDescription": "Enables the stdin_write command without any pre-configured scope." "markdownDescription": "Denies the get_current command without any pre-configured scope."
}, },
{ {
"description": "Denies the execute command without any pre-configured scope.", "description": "Denies the is_registered command without any pre-configured scope.",
"type": "string", "type": "string",
"const": "shell:deny-execute", "const": "deep-link:deny-is-registered",
"markdownDescription": "Denies the execute command without any pre-configured scope." "markdownDescription": "Denies the is_registered command without any pre-configured scope."
}, },
{ {
"description": "Denies the kill command without any pre-configured scope.", "description": "Denies the register command without any pre-configured scope.",
"type": "string", "type": "string",
"const": "shell:deny-kill", "const": "deep-link:deny-register",
"markdownDescription": "Denies the kill command without any pre-configured scope." "markdownDescription": "Denies the register command without any pre-configured scope."
}, },
{ {
"description": "Denies the open command without any pre-configured scope.", "description": "Denies the unregister command without any pre-configured scope.",
"type": "string", "type": "string",
"const": "shell:deny-open", "const": "deep-link:deny-unregister",
"markdownDescription": "Denies the open command without any pre-configured scope." "markdownDescription": "Denies the unregister command without any pre-configured scope."
}, },
{ {
"description": "Denies the spawn command without any pre-configured scope.", "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\n#### This default permission set includes:\n\n- `allow-is-permission-granted`\n- `allow-request-permission`\n- `allow-notify`\n- `allow-register-action-types`\n- `allow-register-listener`\n- `allow-cancel`\n- `allow-get-pending`\n- `allow-remove-active`\n- `allow-get-active`\n- `allow-check-permissions`\n- `allow-show`\n- `allow-batch`\n- `allow-list-channels`\n- `allow-delete-channel`\n- `allow-create-channel`\n- `allow-permission-state`",
"type": "string", "type": "string",
"const": "shell:deny-spawn", "const": "notification:default",
"markdownDescription": "Denies the spawn command without any pre-configured scope." "markdownDescription": "This permission set configures which\nnotification features are by default exposed.\n\n#### Granted Permissions\n\nIt allows all notification related features.\n\n\n#### This default permission set includes:\n\n- `allow-is-permission-granted`\n- `allow-request-permission`\n- `allow-notify`\n- `allow-register-action-types`\n- `allow-register-listener`\n- `allow-cancel`\n- `allow-get-pending`\n- `allow-remove-active`\n- `allow-get-active`\n- `allow-check-permissions`\n- `allow-show`\n- `allow-batch`\n- `allow-list-channels`\n- `allow-delete-channel`\n- `allow-create-channel`\n- `allow-permission-state`"
}, },
{ {
"description": "Denies the stdin_write command without any pre-configured scope.", "description": "Enables the batch command without any pre-configured scope.",
"type": "string", "type": "string",
"const": "shell:deny-stdin-write", "const": "notification:allow-batch",
"markdownDescription": "Denies the stdin_write command without any pre-configured scope." "markdownDescription": "Enables the batch command without any pre-configured scope."
}, },
{ {
"description": "This permission set configures what kind of\noperations are available from the window state plugin.\n\n#### Granted Permissions\n\nAll operations are enabled by default.\n\n\n#### This default permission set includes:\n\n- `allow-filename`\n- `allow-restore-state`\n- `allow-save-window-state`", "description": "Enables the cancel command without any pre-configured scope.",
"type": "string", "type": "string",
"const": "window-state:default", "const": "notification:allow-cancel",
"markdownDescription": "This permission set configures what kind of\noperations are available from the window state plugin.\n\n#### Granted Permissions\n\nAll operations are enabled by default.\n\n\n#### This default permission set includes:\n\n- `allow-filename`\n- `allow-restore-state`\n- `allow-save-window-state`" "markdownDescription": "Enables the cancel command without any pre-configured scope."
}, },
{ {
"description": "Enables the filename command without any pre-configured scope.", "description": "Enables the check_permissions command without any pre-configured scope.",
"type": "string", "type": "string",
"const": "window-state:allow-filename", "const": "notification:allow-check-permissions",
"markdownDescription": "Enables the filename command without any pre-configured scope." "markdownDescription": "Enables the check_permissions command without any pre-configured scope."
}, },
{ {
"description": "Enables the restore_state command without any pre-configured scope.", "description": "Enables the create_channel command without any pre-configured scope.",
"type": "string", "type": "string",
"const": "window-state:allow-restore-state", "const": "notification:allow-create-channel",
"markdownDescription": "Enables the restore_state command without any pre-configured scope." "markdownDescription": "Enables the create_channel command without any pre-configured scope."
}, },
{ {
"description": "Enables the save_window_state command without any pre-configured scope.", "description": "Enables the delete_channel command without any pre-configured scope.",
"type": "string", "type": "string",
"const": "window-state:allow-save-window-state", "const": "notification:allow-delete-channel",
"markdownDescription": "Enables the save_window_state command without any pre-configured scope." "markdownDescription": "Enables the delete_channel command without any pre-configured scope."
}, },
{ {
"description": "Denies the filename command without any pre-configured scope.", "description": "Enables the get_active command without any pre-configured scope.",
"type": "string", "type": "string",
"const": "window-state:deny-filename", "const": "notification:allow-get-active",
"markdownDescription": "Denies the filename command without any pre-configured scope." "markdownDescription": "Enables the get_active command without any pre-configured scope."
}, },
{ {
"description": "Denies the restore_state command without any pre-configured scope.", "description": "Enables the get_pending command without any pre-configured scope.",
"type": "string", "type": "string",
"const": "window-state:deny-restore-state", "const": "notification:allow-get-pending",
"markdownDescription": "Denies the restore_state command without any pre-configured scope." "markdownDescription": "Enables the get_pending command without any pre-configured scope."
}, },
{ {
"description": "Denies the save_window_state command without any pre-configured scope.", "description": "Enables the is_permission_granted command without any pre-configured scope.",
"type": "string", "type": "string",
"const": "window-state:deny-save-window-state", "const": "notification:allow-is-permission-granted",
"markdownDescription": "Denies the save_window_state command without any pre-configured scope." "markdownDescription": "Enables the is_permission_granted command without any pre-configured scope."
},
{
"description": "Enables the list_channels command without any pre-configured scope.",
"type": "string",
"const": "notification:allow-list-channels",
"markdownDescription": "Enables the list_channels command without any pre-configured scope."
},
{
"description": "Enables the notify command without any pre-configured scope.",
"type": "string",
"const": "notification:allow-notify",
"markdownDescription": "Enables the notify command without any pre-configured scope."
},
{
"description": "Enables the permission_state command without any pre-configured scope.",
"type": "string",
"const": "notification:allow-permission-state",
"markdownDescription": "Enables the permission_state command without any pre-configured scope."
},
{
"description": "Enables the register_action_types command without any pre-configured scope.",
"type": "string",
"const": "notification:allow-register-action-types",
"markdownDescription": "Enables the register_action_types command without any pre-configured scope."
},
{
"description": "Enables the register_listener command without any pre-configured scope.",
"type": "string",
"const": "notification:allow-register-listener",
"markdownDescription": "Enables the register_listener command without any pre-configured scope."
},
{
"description": "Enables the remove_active command without any pre-configured scope.",
"type": "string",
"const": "notification:allow-remove-active",
"markdownDescription": "Enables the remove_active command without any pre-configured scope."
},
{
"description": "Enables the request_permission command without any pre-configured scope.",
"type": "string",
"const": "notification:allow-request-permission",
"markdownDescription": "Enables the request_permission command without any pre-configured scope."
},
{
"description": "Enables the show command without any pre-configured scope.",
"type": "string",
"const": "notification:allow-show",
"markdownDescription": "Enables the show command without any pre-configured scope."
},
{
"description": "Denies the batch command without any pre-configured scope.",
"type": "string",
"const": "notification:deny-batch",
"markdownDescription": "Denies the batch command without any pre-configured scope."
},
{
"description": "Denies the cancel command without any pre-configured scope.",
"type": "string",
"const": "notification:deny-cancel",
"markdownDescription": "Denies the cancel command without any pre-configured scope."
},
{
"description": "Denies the check_permissions command without any pre-configured scope.",
"type": "string",
"const": "notification:deny-check-permissions",
"markdownDescription": "Denies the check_permissions command without any pre-configured scope."
},
{
"description": "Denies the create_channel command without any pre-configured scope.",
"type": "string",
"const": "notification:deny-create-channel",
"markdownDescription": "Denies the create_channel command without any pre-configured scope."
},
{
"description": "Denies the delete_channel command without any pre-configured scope.",
"type": "string",
"const": "notification:deny-delete-channel",
"markdownDescription": "Denies the delete_channel command without any pre-configured scope."
},
{
"description": "Denies the get_active command without any pre-configured scope.",
"type": "string",
"const": "notification:deny-get-active",
"markdownDescription": "Denies the get_active command without any pre-configured scope."
},
{
"description": "Denies the get_pending command without any pre-configured scope.",
"type": "string",
"const": "notification:deny-get-pending",
"markdownDescription": "Denies the get_pending command without any pre-configured scope."
},
{
"description": "Denies the is_permission_granted command without any pre-configured scope.",
"type": "string",
"const": "notification:deny-is-permission-granted",
"markdownDescription": "Denies the is_permission_granted command without any pre-configured scope."
},
{
"description": "Denies the list_channels command without any pre-configured scope.",
"type": "string",
"const": "notification:deny-list-channels",
"markdownDescription": "Denies the list_channels command without any pre-configured scope."
},
{
"description": "Denies the notify command without any pre-configured scope.",
"type": "string",
"const": "notification:deny-notify",
"markdownDescription": "Denies the notify command without any pre-configured scope."
},
{
"description": "Denies the permission_state command without any pre-configured scope.",
"type": "string",
"const": "notification:deny-permission-state",
"markdownDescription": "Denies the permission_state command without any pre-configured scope."
},
{
"description": "Denies the register_action_types command without any pre-configured scope.",
"type": "string",
"const": "notification:deny-register-action-types",
"markdownDescription": "Denies the register_action_types command without any pre-configured scope."
},
{
"description": "Denies the register_listener command without any pre-configured scope.",
"type": "string",
"const": "notification:deny-register-listener",
"markdownDescription": "Denies the register_listener command without any pre-configured scope."
},
{
"description": "Denies the remove_active command without any pre-configured scope.",
"type": "string",
"const": "notification:deny-remove-active",
"markdownDescription": "Denies the remove_active command without any pre-configured scope."
},
{
"description": "Denies the request_permission command without any pre-configured scope.",
"type": "string",
"const": "notification:deny-request-permission",
"markdownDescription": "Denies the request_permission command without any pre-configured scope."
},
{
"description": "Denies the show command without any pre-configured scope.",
"type": "string",
"const": "notification:deny-show",
"markdownDescription": "Denies the show command without any pre-configured scope."
},
{
"description": "This permission set allows opening `mailto:`, `tel:`, `https://` and `http://` urls using their default application\nas well as reveal file in directories using default file explorer\n#### This default permission set includes:\n\n- `allow-open-url`\n- `allow-reveal-item-in-dir`\n- `allow-default-urls`",
"type": "string",
"const": "opener:default",
"markdownDescription": "This permission set allows opening `mailto:`, `tel:`, `https://` and `http://` urls using their default application\nas well as reveal file in directories using default file explorer\n#### This default permission set includes:\n\n- `allow-open-url`\n- `allow-reveal-item-in-dir`\n- `allow-default-urls`"
},
{
"description": "This enables opening `mailto:`, `tel:`, `https://` and `http://` urls using their default application.",
"type": "string",
"const": "opener:allow-default-urls",
"markdownDescription": "This enables opening `mailto:`, `tel:`, `https://` and `http://` urls using their default application."
},
{
"description": "Enables the open_path command without any pre-configured scope.",
"type": "string",
"const": "opener:allow-open-path",
"markdownDescription": "Enables the open_path command without any pre-configured scope."
},
{
"description": "Enables the open_url command without any pre-configured scope.",
"type": "string",
"const": "opener:allow-open-url",
"markdownDescription": "Enables the open_url command without any pre-configured scope."
},
{
"description": "Enables the reveal_item_in_dir command without any pre-configured scope.",
"type": "string",
"const": "opener:allow-reveal-item-in-dir",
"markdownDescription": "Enables the reveal_item_in_dir command without any pre-configured scope."
},
{
"description": "Denies the open_path command without any pre-configured scope.",
"type": "string",
"const": "opener:deny-open-path",
"markdownDescription": "Denies the open_path command without any pre-configured scope."
},
{
"description": "Denies the open_url command without any pre-configured scope.",
"type": "string",
"const": "opener:deny-open-url",
"markdownDescription": "Denies the open_url command without any pre-configured scope."
},
{
"description": "Denies the reveal_item_in_dir command without any pre-configured scope.",
"type": "string",
"const": "opener:deny-reveal-item-in-dir",
"markdownDescription": "Denies the reveal_item_in_dir command without any pre-configured scope."
} }
] ]
}, },
@@ -2558,47 +2708,20 @@
} }
] ]
}, },
"ShellScopeEntryAllowedArg": { "Application": {
"description": "A command argument allowed to be executed by the webview API.", "description": "Opener scope application.",
"anyOf": [ "anyOf": [
{ {
"description": "A non-configurable argument that is passed to the command in the order it was specified.", "description": "Open in default application.",
"type": "string" "type": "null"
}, },
{ {
"description": "A variable that is set while calling the command from the webview API.", "description": "If true, allow open with any application.",
"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]: <https://docs.rs/regex/latest/regex/#syntax>",
"type": "string"
}
},
"additionalProperties": false
}
]
},
"ShellScopeEntryAllowedArgs": {
"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 [`ShellScopeEntryAllowedArg`] 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" "type": "boolean"
}, },
{ {
"description": "A specific set of [`ShellScopeEntryAllowedArg`] that are valid to call for the command configuration.", "description": "Allow specific application to open with.",
"type": "array", "type": "string"
"items": {
"$ref": "#/definitions/ShellScopeEntryAllowedArg"
}
} }
] ]
} }

View File

@@ -140,70 +140,52 @@
"identifier": { "identifier": {
"anyOf": [ "anyOf": [
{ {
"description": "This permission set configures which\nshell functionality is exposed by default.\n\n#### Granted Permissions\n\nIt allows to use the `open` functionality with a reasonable\nscope pre-configured. It will allow opening `http(s)://`,\n`tel:` and `mailto:` links.\n\n#### This default permission set includes:\n\n- `allow-open`", "description": "This permission set allows opening `mailto:`, `tel:`, `https://` and `http://` urls using their default application\nas well as reveal file in directories using default file explorer\n#### This default permission set includes:\n\n- `allow-open-url`\n- `allow-reveal-item-in-dir`\n- `allow-default-urls`",
"type": "string", "type": "string",
"const": "shell:default", "const": "opener:default",
"markdownDescription": "This permission set configures which\nshell functionality is exposed by default.\n\n#### Granted Permissions\n\nIt allows to use the `open` functionality with a reasonable\nscope pre-configured. It will allow opening `http(s)://`,\n`tel:` and `mailto:` links.\n\n#### This default permission set includes:\n\n- `allow-open`" "markdownDescription": "This permission set allows opening `mailto:`, `tel:`, `https://` and `http://` urls using their default application\nas well as reveal file in directories using default file explorer\n#### This default permission set includes:\n\n- `allow-open-url`\n- `allow-reveal-item-in-dir`\n- `allow-default-urls`"
}, },
{ {
"description": "Enables the execute command without any pre-configured scope.", "description": "This enables opening `mailto:`, `tel:`, `https://` and `http://` urls using their default application.",
"type": "string", "type": "string",
"const": "shell:allow-execute", "const": "opener:allow-default-urls",
"markdownDescription": "Enables the execute command without any pre-configured scope." "markdownDescription": "This enables opening `mailto:`, `tel:`, `https://` and `http://` urls using their default application."
}, },
{ {
"description": "Enables the kill command without any pre-configured scope.", "description": "Enables the open_path command without any pre-configured scope.",
"type": "string", "type": "string",
"const": "shell:allow-kill", "const": "opener:allow-open-path",
"markdownDescription": "Enables the kill command without any pre-configured scope." "markdownDescription": "Enables the open_path command without any pre-configured scope."
}, },
{ {
"description": "Enables the open command without any pre-configured scope.", "description": "Enables the open_url command without any pre-configured scope.",
"type": "string", "type": "string",
"const": "shell:allow-open", "const": "opener:allow-open-url",
"markdownDescription": "Enables the open command without any pre-configured scope." "markdownDescription": "Enables the open_url command without any pre-configured scope."
}, },
{ {
"description": "Enables the spawn command without any pre-configured scope.", "description": "Enables the reveal_item_in_dir command without any pre-configured scope.",
"type": "string", "type": "string",
"const": "shell:allow-spawn", "const": "opener:allow-reveal-item-in-dir",
"markdownDescription": "Enables the spawn command without any pre-configured scope." "markdownDescription": "Enables the reveal_item_in_dir command without any pre-configured scope."
}, },
{ {
"description": "Enables the stdin_write command without any pre-configured scope.", "description": "Denies the open_path command without any pre-configured scope.",
"type": "string", "type": "string",
"const": "shell:allow-stdin-write", "const": "opener:deny-open-path",
"markdownDescription": "Enables the stdin_write command without any pre-configured scope." "markdownDescription": "Denies the open_path command without any pre-configured scope."
}, },
{ {
"description": "Denies the execute command without any pre-configured scope.", "description": "Denies the open_url command without any pre-configured scope.",
"type": "string", "type": "string",
"const": "shell:deny-execute", "const": "opener:deny-open-url",
"markdownDescription": "Denies the execute command without any pre-configured scope." "markdownDescription": "Denies the open_url command without any pre-configured scope."
}, },
{ {
"description": "Denies the kill command without any pre-configured scope.", "description": "Denies the reveal_item_in_dir command without any pre-configured scope.",
"type": "string", "type": "string",
"const": "shell:deny-kill", "const": "opener:deny-reveal-item-in-dir",
"markdownDescription": "Denies the kill command without any pre-configured scope." "markdownDescription": "Denies the reveal_item_in_dir command without any pre-configured scope."
},
{
"description": "Denies the open command without any pre-configured scope.",
"type": "string",
"const": "shell:deny-open",
"markdownDescription": "Denies the open command without any pre-configured scope."
},
{
"description": "Denies the spawn command without any pre-configured scope.",
"type": "string",
"const": "shell:deny-spawn",
"markdownDescription": "Denies the spawn command without any pre-configured scope."
},
{
"description": "Denies the stdin_write command without any pre-configured scope.",
"type": "string",
"const": "shell:deny-stdin-write",
"markdownDescription": "Denies the stdin_write command without any pre-configured scope."
} }
] ]
} }
@@ -213,120 +195,96 @@
"properties": { "properties": {
"allow": { "allow": {
"items": { "items": {
"title": "ShellScopeEntry", "title": "OpenerScopeEntry",
"description": "Shell scope entry.", "description": "Opener scope entry.",
"anyOf": [ "anyOf": [
{ {
"type": "object", "type": "object",
"required": [ "required": [
"cmd", "url"
"name"
], ],
"properties": { "properties": {
"args": { "app": {
"description": "The allowed arguments for the command execution.", "description": "An application to open this url with, for example: firefox.",
"allOf": [ "allOf": [
{ {
"$ref": "#/definitions/ShellScopeEntryAllowedArgs" "$ref": "#/definitions/Application"
} }
] ]
}, },
"cmd": { "url": {
"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`, `$LOG`, `$TEMP`, `$APPCONFIG`, `$APPDATA`, `$APPLOCALDATA`, `$APPCACHE`, `$APPLOG`.", "description": "A URL that can be opened by the webview when using the Opener APIs.\n\nWildcards can be used following the UNIX glob pattern.\n\nExamples:\n\n- \"https://*\" : allows all HTTPS origin\n\n- \"https://*.github.com/tauri-apps/tauri\": allows any subdomain of \"github.com\" with the \"tauri-apps/api\" path\n\n- \"https://myapi.service.com/users/*\": allows access to any URLs that begins with \"https://myapi.service.com/users/\"",
"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" "type": "string"
} }
}, }
"additionalProperties": false
}, },
{ {
"type": "object", "type": "object",
"required": [ "required": [
"name", "path"
"sidecar"
], ],
"properties": { "properties": {
"args": { "app": {
"description": "The allowed arguments for the command execution.", "description": "An application to open this path with, for example: xdg-open.",
"allOf": [ "allOf": [
{ {
"$ref": "#/definitions/ShellScopeEntryAllowedArgs" "$ref": "#/definitions/Application"
} }
] ]
}, },
"name": { "path": {
"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.", "description": "A path that can be opened by the webview when using the Opener APIs.\n\nThe pattern 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" "type": "string"
},
"sidecar": {
"description": "If this command is a sidecar command.",
"type": "boolean"
} }
}, }
"additionalProperties": false
} }
] ]
} }
}, },
"deny": { "deny": {
"items": { "items": {
"title": "ShellScopeEntry", "title": "OpenerScopeEntry",
"description": "Shell scope entry.", "description": "Opener scope entry.",
"anyOf": [ "anyOf": [
{ {
"type": "object", "type": "object",
"required": [ "required": [
"cmd", "url"
"name"
], ],
"properties": { "properties": {
"args": { "app": {
"description": "The allowed arguments for the command execution.", "description": "An application to open this url with, for example: firefox.",
"allOf": [ "allOf": [
{ {
"$ref": "#/definitions/ShellScopeEntryAllowedArgs" "$ref": "#/definitions/Application"
} }
] ]
}, },
"cmd": { "url": {
"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`, `$LOG`, `$TEMP`, `$APPCONFIG`, `$APPDATA`, `$APPLOCALDATA`, `$APPCACHE`, `$APPLOG`.", "description": "A URL that can be opened by the webview when using the Opener APIs.\n\nWildcards can be used following the UNIX glob pattern.\n\nExamples:\n\n- \"https://*\" : allows all HTTPS origin\n\n- \"https://*.github.com/tauri-apps/tauri\": allows any subdomain of \"github.com\" with the \"tauri-apps/api\" path\n\n- \"https://myapi.service.com/users/*\": allows access to any URLs that begins with \"https://myapi.service.com/users/\"",
"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" "type": "string"
} }
}, }
"additionalProperties": false
}, },
{ {
"type": "object", "type": "object",
"required": [ "required": [
"name", "path"
"sidecar"
], ],
"properties": { "properties": {
"args": { "app": {
"description": "The allowed arguments for the command execution.", "description": "An application to open this path with, for example: xdg-open.",
"allOf": [ "allOf": [
{ {
"$ref": "#/definitions/ShellScopeEntryAllowedArgs" "$ref": "#/definitions/Application"
} }
] ]
}, },
"name": { "path": {
"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.", "description": "A path that can be opened by the webview when using the Opener APIs.\n\nThe pattern 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" "type": "string"
},
"sidecar": {
"description": "If this command is a sidecar command.",
"type": "boolean"
} }
}, }
"additionalProperties": false
} }
] ]
} }
@@ -386,6 +344,48 @@
"Identifier": { "Identifier": {
"description": "Permission identifier", "description": "Permission identifier",
"oneOf": [ "oneOf": [
{
"description": "This permission set configures if your\napplication can enable or disable auto\nstarting the application on boot.\n\n#### Granted Permissions\n\nIt allows all to check, enable and\ndisable the automatic start on boot.\n\n\n#### This default permission set includes:\n\n- `allow-enable`\n- `allow-disable`\n- `allow-is-enabled`",
"type": "string",
"const": "autostart:default",
"markdownDescription": "This permission set configures if your\napplication can enable or disable auto\nstarting the application on boot.\n\n#### Granted Permissions\n\nIt allows all to check, enable and\ndisable the automatic start on boot.\n\n\n#### This default permission set includes:\n\n- `allow-enable`\n- `allow-disable`\n- `allow-is-enabled`"
},
{
"description": "Enables the disable command without any pre-configured scope.",
"type": "string",
"const": "autostart:allow-disable",
"markdownDescription": "Enables the disable command without any pre-configured scope."
},
{
"description": "Enables the enable command without any pre-configured scope.",
"type": "string",
"const": "autostart:allow-enable",
"markdownDescription": "Enables the enable command without any pre-configured scope."
},
{
"description": "Enables the is_enabled command without any pre-configured scope.",
"type": "string",
"const": "autostart:allow-is-enabled",
"markdownDescription": "Enables the is_enabled command without any pre-configured scope."
},
{
"description": "Denies the disable command without any pre-configured scope.",
"type": "string",
"const": "autostart:deny-disable",
"markdownDescription": "Denies the disable command without any pre-configured scope."
},
{
"description": "Denies the enable command without any pre-configured scope.",
"type": "string",
"const": "autostart:deny-enable",
"markdownDescription": "Denies the enable command without any pre-configured scope."
},
{
"description": "Denies the is_enabled command without any pre-configured scope.",
"type": "string",
"const": "autostart:deny-is-enabled",
"markdownDescription": "Denies the is_enabled command without any pre-configured scope."
},
{ {
"description": "Default core plugins set.\n#### This default permission set includes:\n\n- `core:path:default`\n- `core:event:default`\n- `core:window:default`\n- `core:webview:default`\n- `core:app:default`\n- `core:image:default`\n- `core:resources:default`\n- `core:menu:default`\n- `core:tray:default`", "description": "Default core plugins set.\n#### This default permission set includes:\n\n- `core:path:default`\n- `core:event:default`\n- `core:window:default`\n- `core:webview:default`\n- `core:app:default`\n- `core:image:default`\n- `core:resources:default`\n- `core:menu:default`\n- `core:tray:default`",
"type": "string", "type": "string",
@@ -2355,70 +2355,304 @@
"markdownDescription": "Denies the unminimize command without any pre-configured scope." "markdownDescription": "Denies the unminimize command without any pre-configured scope."
}, },
{ {
"description": "This permission set configures which\nshell functionality is exposed by default.\n\n#### Granted Permissions\n\nIt allows to use the `open` functionality with a reasonable\nscope pre-configured. It will allow opening `http(s)://`,\n`tel:` and `mailto:` links.\n\n#### This default permission set includes:\n\n- `allow-open`", "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\n#### This default permission set includes:\n\n- `allow-is-permission-granted`\n- `allow-request-permission`\n- `allow-notify`\n- `allow-register-action-types`\n- `allow-register-listener`\n- `allow-cancel`\n- `allow-get-pending`\n- `allow-remove-active`\n- `allow-get-active`\n- `allow-check-permissions`\n- `allow-show`\n- `allow-batch`\n- `allow-list-channels`\n- `allow-delete-channel`\n- `allow-create-channel`\n- `allow-permission-state`",
"type": "string", "type": "string",
"const": "shell:default", "const": "notification:default",
"markdownDescription": "This permission set configures which\nshell functionality is exposed by default.\n\n#### Granted Permissions\n\nIt allows to use the `open` functionality with a reasonable\nscope pre-configured. It will allow opening `http(s)://`,\n`tel:` and `mailto:` links.\n\n#### This default permission set includes:\n\n- `allow-open`" "markdownDescription": "This permission set configures which\nnotification features are by default exposed.\n\n#### Granted Permissions\n\nIt allows all notification related features.\n\n\n#### This default permission set includes:\n\n- `allow-is-permission-granted`\n- `allow-request-permission`\n- `allow-notify`\n- `allow-register-action-types`\n- `allow-register-listener`\n- `allow-cancel`\n- `allow-get-pending`\n- `allow-remove-active`\n- `allow-get-active`\n- `allow-check-permissions`\n- `allow-show`\n- `allow-batch`\n- `allow-list-channels`\n- `allow-delete-channel`\n- `allow-create-channel`\n- `allow-permission-state`"
}, },
{ {
"description": "Enables the execute command without any pre-configured scope.", "description": "Enables the batch command without any pre-configured scope.",
"type": "string", "type": "string",
"const": "shell:allow-execute", "const": "notification:allow-batch",
"markdownDescription": "Enables the execute command without any pre-configured scope." "markdownDescription": "Enables the batch command without any pre-configured scope."
}, },
{ {
"description": "Enables the kill command without any pre-configured scope.", "description": "Enables the cancel command without any pre-configured scope.",
"type": "string", "type": "string",
"const": "shell:allow-kill", "const": "notification:allow-cancel",
"markdownDescription": "Enables the kill command without any pre-configured scope." "markdownDescription": "Enables the cancel command without any pre-configured scope."
}, },
{ {
"description": "Enables the open command without any pre-configured scope.", "description": "Enables the check_permissions command without any pre-configured scope.",
"type": "string", "type": "string",
"const": "shell:allow-open", "const": "notification:allow-check-permissions",
"markdownDescription": "Enables the open command without any pre-configured scope." "markdownDescription": "Enables the check_permissions command without any pre-configured scope."
}, },
{ {
"description": "Enables the spawn command without any pre-configured scope.", "description": "Enables the create_channel command without any pre-configured scope.",
"type": "string", "type": "string",
"const": "shell:allow-spawn", "const": "notification:allow-create-channel",
"markdownDescription": "Enables the spawn command without any pre-configured scope." "markdownDescription": "Enables the create_channel command without any pre-configured scope."
}, },
{ {
"description": "Enables the stdin_write command without any pre-configured scope.", "description": "Enables the delete_channel command without any pre-configured scope.",
"type": "string", "type": "string",
"const": "shell:allow-stdin-write", "const": "notification:allow-delete-channel",
"markdownDescription": "Enables the stdin_write command without any pre-configured scope." "markdownDescription": "Enables the delete_channel command without any pre-configured scope."
}, },
{ {
"description": "Denies the execute command without any pre-configured scope.", "description": "Enables the get_active command without any pre-configured scope.",
"type": "string", "type": "string",
"const": "shell:deny-execute", "const": "notification:allow-get-active",
"markdownDescription": "Denies the execute command without any pre-configured scope." "markdownDescription": "Enables the get_active command without any pre-configured scope."
}, },
{ {
"description": "Denies the kill command without any pre-configured scope.", "description": "Enables the get_pending command without any pre-configured scope.",
"type": "string", "type": "string",
"const": "shell:deny-kill", "const": "notification:allow-get-pending",
"markdownDescription": "Denies the kill command without any pre-configured scope." "markdownDescription": "Enables the get_pending command without any pre-configured scope."
}, },
{ {
"description": "Denies the open command without any pre-configured scope.", "description": "Enables the is_permission_granted command without any pre-configured scope.",
"type": "string", "type": "string",
"const": "shell:deny-open", "const": "notification:allow-is-permission-granted",
"markdownDescription": "Denies the open command without any pre-configured scope." "markdownDescription": "Enables the is_permission_granted command without any pre-configured scope."
}, },
{ {
"description": "Denies the spawn command without any pre-configured scope.", "description": "Enables the list_channels command without any pre-configured scope.",
"type": "string", "type": "string",
"const": "shell:deny-spawn", "const": "notification:allow-list-channels",
"markdownDescription": "Denies the spawn command without any pre-configured scope." "markdownDescription": "Enables the list_channels command without any pre-configured scope."
}, },
{ {
"description": "Denies the stdin_write command without any pre-configured scope.", "description": "Enables the notify command without any pre-configured scope.",
"type": "string", "type": "string",
"const": "shell:deny-stdin-write", "const": "notification:allow-notify",
"markdownDescription": "Denies the stdin_write command without any pre-configured scope." "markdownDescription": "Enables the notify command without any pre-configured scope."
},
{
"description": "Enables the permission_state command without any pre-configured scope.",
"type": "string",
"const": "notification:allow-permission-state",
"markdownDescription": "Enables the permission_state command without any pre-configured scope."
},
{
"description": "Enables the register_action_types command without any pre-configured scope.",
"type": "string",
"const": "notification:allow-register-action-types",
"markdownDescription": "Enables the register_action_types command without any pre-configured scope."
},
{
"description": "Enables the register_listener command without any pre-configured scope.",
"type": "string",
"const": "notification:allow-register-listener",
"markdownDescription": "Enables the register_listener command without any pre-configured scope."
},
{
"description": "Enables the remove_active command without any pre-configured scope.",
"type": "string",
"const": "notification:allow-remove-active",
"markdownDescription": "Enables the remove_active command without any pre-configured scope."
},
{
"description": "Enables the request_permission command without any pre-configured scope.",
"type": "string",
"const": "notification:allow-request-permission",
"markdownDescription": "Enables the request_permission command without any pre-configured scope."
},
{
"description": "Enables the show command without any pre-configured scope.",
"type": "string",
"const": "notification:allow-show",
"markdownDescription": "Enables the show command without any pre-configured scope."
},
{
"description": "Denies the batch command without any pre-configured scope.",
"type": "string",
"const": "notification:deny-batch",
"markdownDescription": "Denies the batch command without any pre-configured scope."
},
{
"description": "Denies the cancel command without any pre-configured scope.",
"type": "string",
"const": "notification:deny-cancel",
"markdownDescription": "Denies the cancel command without any pre-configured scope."
},
{
"description": "Denies the check_permissions command without any pre-configured scope.",
"type": "string",
"const": "notification:deny-check-permissions",
"markdownDescription": "Denies the check_permissions command without any pre-configured scope."
},
{
"description": "Denies the create_channel command without any pre-configured scope.",
"type": "string",
"const": "notification:deny-create-channel",
"markdownDescription": "Denies the create_channel command without any pre-configured scope."
},
{
"description": "Denies the delete_channel command without any pre-configured scope.",
"type": "string",
"const": "notification:deny-delete-channel",
"markdownDescription": "Denies the delete_channel command without any pre-configured scope."
},
{
"description": "Denies the get_active command without any pre-configured scope.",
"type": "string",
"const": "notification:deny-get-active",
"markdownDescription": "Denies the get_active command without any pre-configured scope."
},
{
"description": "Denies the get_pending command without any pre-configured scope.",
"type": "string",
"const": "notification:deny-get-pending",
"markdownDescription": "Denies the get_pending command without any pre-configured scope."
},
{
"description": "Denies the is_permission_granted command without any pre-configured scope.",
"type": "string",
"const": "notification:deny-is-permission-granted",
"markdownDescription": "Denies the is_permission_granted command without any pre-configured scope."
},
{
"description": "Denies the list_channels command without any pre-configured scope.",
"type": "string",
"const": "notification:deny-list-channels",
"markdownDescription": "Denies the list_channels command without any pre-configured scope."
},
{
"description": "Denies the notify command without any pre-configured scope.",
"type": "string",
"const": "notification:deny-notify",
"markdownDescription": "Denies the notify command without any pre-configured scope."
},
{
"description": "Denies the permission_state command without any pre-configured scope.",
"type": "string",
"const": "notification:deny-permission-state",
"markdownDescription": "Denies the permission_state command without any pre-configured scope."
},
{
"description": "Denies the register_action_types command without any pre-configured scope.",
"type": "string",
"const": "notification:deny-register-action-types",
"markdownDescription": "Denies the register_action_types command without any pre-configured scope."
},
{
"description": "Denies the register_listener command without any pre-configured scope.",
"type": "string",
"const": "notification:deny-register-listener",
"markdownDescription": "Denies the register_listener command without any pre-configured scope."
},
{
"description": "Denies the remove_active command without any pre-configured scope.",
"type": "string",
"const": "notification:deny-remove-active",
"markdownDescription": "Denies the remove_active command without any pre-configured scope."
},
{
"description": "Denies the request_permission command without any pre-configured scope.",
"type": "string",
"const": "notification:deny-request-permission",
"markdownDescription": "Denies the request_permission command without any pre-configured scope."
},
{
"description": "Denies the show command without any pre-configured scope.",
"type": "string",
"const": "notification:deny-show",
"markdownDescription": "Denies the show command without any pre-configured scope."
},
{
"description": "This permission set allows opening `mailto:`, `tel:`, `https://` and `http://` urls using their default application\nas well as reveal file in directories using default file explorer\n#### This default permission set includes:\n\n- `allow-open-url`\n- `allow-reveal-item-in-dir`\n- `allow-default-urls`",
"type": "string",
"const": "opener:default",
"markdownDescription": "This permission set allows opening `mailto:`, `tel:`, `https://` and `http://` urls using their default application\nas well as reveal file in directories using default file explorer\n#### This default permission set includes:\n\n- `allow-open-url`\n- `allow-reveal-item-in-dir`\n- `allow-default-urls`"
},
{
"description": "This enables opening `mailto:`, `tel:`, `https://` and `http://` urls using their default application.",
"type": "string",
"const": "opener:allow-default-urls",
"markdownDescription": "This enables opening `mailto:`, `tel:`, `https://` and `http://` urls using their default application."
},
{
"description": "Enables the open_path command without any pre-configured scope.",
"type": "string",
"const": "opener:allow-open-path",
"markdownDescription": "Enables the open_path command without any pre-configured scope."
},
{
"description": "Enables the open_url command without any pre-configured scope.",
"type": "string",
"const": "opener:allow-open-url",
"markdownDescription": "Enables the open_url command without any pre-configured scope."
},
{
"description": "Enables the reveal_item_in_dir command without any pre-configured scope.",
"type": "string",
"const": "opener:allow-reveal-item-in-dir",
"markdownDescription": "Enables the reveal_item_in_dir command without any pre-configured scope."
},
{
"description": "Denies the open_path command without any pre-configured scope.",
"type": "string",
"const": "opener:deny-open-path",
"markdownDescription": "Denies the open_path command without any pre-configured scope."
},
{
"description": "Denies the open_url command without any pre-configured scope.",
"type": "string",
"const": "opener:deny-open-url",
"markdownDescription": "Denies the open_url command without any pre-configured scope."
},
{
"description": "Denies the reveal_item_in_dir command without any pre-configured scope.",
"type": "string",
"const": "opener:deny-reveal-item-in-dir",
"markdownDescription": "Denies the reveal_item_in_dir command without any pre-configured scope."
},
{
"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\n#### This default permission set includes:\n\n- `allow-check`\n- `allow-download`\n- `allow-install`\n- `allow-download-and-install`",
"type": "string",
"const": "updater:default",
"markdownDescription": "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\n#### This default permission set includes:\n\n- `allow-check`\n- `allow-download`\n- `allow-install`\n- `allow-download-and-install`"
},
{
"description": "Enables the check command without any pre-configured scope.",
"type": "string",
"const": "updater:allow-check",
"markdownDescription": "Enables the check command without any pre-configured scope."
},
{
"description": "Enables the download command without any pre-configured scope.",
"type": "string",
"const": "updater:allow-download",
"markdownDescription": "Enables the download command without any pre-configured scope."
},
{
"description": "Enables the download_and_install command without any pre-configured scope.",
"type": "string",
"const": "updater:allow-download-and-install",
"markdownDescription": "Enables the download_and_install command without any pre-configured scope."
},
{
"description": "Enables the install command without any pre-configured scope.",
"type": "string",
"const": "updater:allow-install",
"markdownDescription": "Enables the install command without any pre-configured scope."
},
{
"description": "Denies the check command without any pre-configured scope.",
"type": "string",
"const": "updater:deny-check",
"markdownDescription": "Denies the check command without any pre-configured scope."
},
{
"description": "Denies the download command without any pre-configured scope.",
"type": "string",
"const": "updater:deny-download",
"markdownDescription": "Denies the download command without any pre-configured scope."
},
{
"description": "Denies the download_and_install command without any pre-configured scope.",
"type": "string",
"const": "updater:deny-download-and-install",
"markdownDescription": "Denies the download_and_install command without any pre-configured scope."
},
{
"description": "Denies the install command without any pre-configured scope.",
"type": "string",
"const": "updater:deny-install",
"markdownDescription": "Denies the install command without any pre-configured scope."
}, },
{ {
"description": "This permission set configures what kind of\noperations are available from the window state plugin.\n\n#### Granted Permissions\n\nAll operations are enabled by default.\n\n\n#### This default permission set includes:\n\n- `allow-filename`\n- `allow-restore-state`\n- `allow-save-window-state`", "description": "This permission set configures what kind of\noperations are available from the window state plugin.\n\n#### Granted Permissions\n\nAll operations are enabled by default.\n\n\n#### This default permission set includes:\n\n- `allow-filename`\n- `allow-restore-state`\n- `allow-save-window-state`",
@@ -2558,47 +2792,20 @@
} }
] ]
}, },
"ShellScopeEntryAllowedArg": { "Application": {
"description": "A command argument allowed to be executed by the webview API.", "description": "Opener scope application.",
"anyOf": [ "anyOf": [
{ {
"description": "A non-configurable argument that is passed to the command in the order it was specified.", "description": "Open in default application.",
"type": "string" "type": "null"
}, },
{ {
"description": "A variable that is set while calling the command from the webview API.", "description": "If true, allow open with any application.",
"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]: <https://docs.rs/regex/latest/regex/#syntax>",
"type": "string"
}
},
"additionalProperties": false
}
]
},
"ShellScopeEntryAllowedArgs": {
"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 [`ShellScopeEntryAllowedArg`] 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" "type": "boolean"
}, },
{ {
"description": "A specific set of [`ShellScopeEntryAllowedArg`] that are valid to call for the command configuration.", "description": "Allow specific application to open with.",
"type": "array", "type": "string"
"items": {
"$ref": "#/definitions/ShellScopeEntryAllowedArg"
}
} }
] ]
} }

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.5 KiB

After

Width:  |  Height:  |  Size: 24 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.1 KiB

After

Width:  |  Height:  |  Size: 81 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.0 KiB

After

Width:  |  Height:  |  Size: 2.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.0 KiB

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.0 KiB

After

Width:  |  Height:  |  Size: 29 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.1 KiB

After

Width:  |  Height:  |  Size: 32 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 8.0 KiB

After

Width:  |  Height:  |  Size: 100 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.1 KiB

After

Width:  |  Height:  |  Size: 2.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 8.8 KiB

After

Width:  |  Height:  |  Size: 118 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.6 KiB

After

Width:  |  Height:  |  Size: 4.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.9 KiB

After

Width:  |  Height:  |  Size: 8.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.4 KiB

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.8 KiB

After

Width:  |  Height:  |  Size: 4.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 20 KiB

After

Width:  |  Height:  |  Size: 151 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 81 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 15 KiB

After

Width:  |  Height:  |  Size: 295 KiB

View File

@@ -1,35 +1,182 @@
//! Cinny Desktop library for cross-platform builds including Android //! Paarrot Desktop library for cross-platform builds including Android
#[cfg(mobile)] #[cfg(mobile)]
mod mobile; mod mobile;
#[cfg(mobile)] #[cfg(not(any(target_os = "android", target_os = "ios")))]
pub use mobile::*; use tauri::{
Manager,
WebviewUrl,
menu::{Menu, MenuItem},
tray::{MouseButton, MouseButtonState, TrayIconBuilder, TrayIconEvent},
webview::WebviewWindowBuilder,
WindowEvent,
};
/// Read image from clipboard on Linux using arboard with Wayland support
#[cfg(target_os = "linux")]
#[tauri::command]
fn read_clipboard_image() -> Result<Option<String>, String> {
use arboard::Clipboard;
use base64::{Engine as _, engine::general_purpose::STANDARD as BASE64};
let mut clipboard = Clipboard::new().map_err(|e| e.to_string())?;
match clipboard.get_image() {
Ok(img) => {
// Convert RGBA image data to PNG
let width = img.width as u32;
let height = img.height as u32;
let mut png_data = Vec::new();
{
let mut encoder = png::Encoder::new(&mut png_data, width, height);
encoder.set_color(png::ColorType::Rgba);
encoder.set_depth(png::BitDepth::Eight);
let mut writer = encoder.write_header().map_err(|e| e.to_string())?;
writer.write_image_data(&img.bytes).map_err(|e| e.to_string())?;
}
let base64_data = BASE64.encode(&png_data);
Ok(Some(format!("data:image/png;base64,{}", base64_data)))
}
Err(_) => Ok(None), // No image in clipboard
}
}
/// Stub for non-Linux platforms - returns None
#[cfg(not(target_os = "linux"))]
#[tauri::command]
fn read_clipboard_image() -> Result<Option<String>, String> {
Ok(None)
}
/// Open a URL in the default browser (bypasses ACL issues with localhost plugin)
#[cfg(not(any(target_os = "android", target_os = "ios")))]
#[tauri::command]
fn open_external_url(url: String) -> Result<(), String> {
open::that(&url).map_err(|e| e.to_string())
}
/// Runs the Tauri application /// Runs the Tauri application
pub fn run() { pub fn run() {
let port = 44548;
#[cfg(not(any(target_os = "android", target_os = "ios")))] #[cfg(not(any(target_os = "android", target_os = "ios")))]
let builder = { {
let port = 44548;
tauri::Builder::default() tauri::Builder::default()
.plugin(tauri_plugin_localhost::Builder::new(port).build()) .plugin(tauri_plugin_localhost::Builder::new(port).build())
.plugin(tauri_plugin_shell::init()) .plugin(tauri_plugin_opener::init())
.plugin(tauri_plugin_window_state::Builder::default().build()) .plugin(tauri_plugin_window_state::Builder::default().build())
.plugin(tauri_plugin_single_instance::init(|_app, _args, _cwd| {})) .plugin(tauri_plugin_single_instance::init(|app, _args, _cwd| {
// When a second instance tries to launch, focus the existing window
if let Some(window) = app.get_webview_window("main") {
let _ = window.unminimize();
let _ = window.show();
let _ = window.set_focus();
}
}))
.plugin(tauri_plugin_notification::init()) .plugin(tauri_plugin_notification::init())
.plugin(tauri_plugin_updater::Builder::new().build()) .plugin(tauri_plugin_updater::Builder::new().build())
}; .plugin(tauri_plugin_autostart::init(
tauri_plugin_autostart::MacosLauncher::LaunchAgent,
Some(vec!["--minimized"]),
))
.setup(move |app| {
// In dev mode, use Vite dev server; in production, use localhost plugin
let url: tauri::Url = if cfg!(dev) {
"http://localhost:8080".parse().unwrap()
} else {
format!("http://localhost:{}", port).parse().unwrap()
};
// Create the main window manually with navigation handler for external links
WebviewWindowBuilder::new(app, "main", WebviewUrl::External(url))
.title("Paarrot")
.inner_size(1280.0, 905.0)
.center()
.resizable(true)
.disable_drag_drop_handler()
.on_navigation(|url| {
let url_str = url.as_str();
// Allow navigation to localhost (our app) and special protocols
if url_str.starts_with("http://localhost")
|| url_str.starts_with("https://localhost")
|| url_str.starts_with("tauri://")
|| url_str.starts_with("blob:")
|| url_str.starts_with("data:")
{
return true;
}
// Block external URLs - open them in default browser
if url_str.starts_with("http://") || url_str.starts_with("https://") {
let _ = tauri_plugin_opener::open_url(url_str, None::<&str>);
return false;
}
true
})
.build()?;
// Create system tray
let show_item = MenuItem::with_id(app, "show", "Show Paarrot", true, None::<&str>)?;
let quit_item = MenuItem::with_id(app, "quit", "Quit", true, None::<&str>)?;
let menu = Menu::with_items(app, &[&show_item, &quit_item])?;
let _tray = TrayIconBuilder::new()
.icon(app.default_window_icon().unwrap().clone())
.menu(&menu)
.show_menu_on_left_click(false)
.on_menu_event(|app, event| match event.id.as_ref() {
"show" => {
if let Some(window) = app.get_webview_window("main") {
let _ = window.unminimize();
let _ = window.show();
let _ = window.set_focus();
}
}
"quit" => {
app.exit(0);
}
_ => {}
})
.on_tray_icon_event(|tray, event| {
if let TrayIconEvent::Click {
button: MouseButton::Left,
button_state: MouseButtonState::Up,
..
} = event
{
let app = tray.app_handle();
if let Some(window) = app.get_webview_window("main") {
let _ = window.unminimize();
let _ = window.show();
let _ = window.set_focus();
}
}
})
.build(app)?;
Ok(())
})
.on_window_event(|window, event| {
// Minimize to tray on close instead of quitting
if let WindowEvent::CloseRequested { api, .. } = event {
window.hide().unwrap();
api.prevent_close();
}
})
.invoke_handler(tauri::generate_handler![read_clipboard_image, open_external_url])
.run(tauri::generate_context!())
.expect("error while building tauri application");
}
#[cfg(any(target_os = "android", target_os = "ios"))] #[cfg(any(target_os = "android", target_os = "ios"))]
let builder = { {
tauri::Builder::default() tauri::Builder::default()
.plugin(tauri_plugin_localhost::Builder::new(port).build()) .plugin(tauri_plugin_opener::init())
.plugin(tauri_plugin_shell::init())
.plugin(tauri_plugin_notification::init()) .plugin(tauri_plugin_notification::init())
}; .plugin(tauri_plugin_deep_link::init())
.invoke_handler(tauri::generate_handler![read_clipboard_image])
builder .run(tauri::generate_context!())
.run(tauri::generate_context!()) .expect("error while building tauri application");
.expect("error while building tauri application"); }
} }

View File

@@ -4,5 +4,5 @@
)] )]
fn main() { fn main() {
cinny_lib::run(); paarrot_lib::run();
} }

View File

@@ -1,8 +1,8 @@
{ {
"$schema": "https://schema.tauri.app/config/2", "$schema": "https://schema.tauri.app/config/2",
"productName": "Cinny", "productName": "Paarrot",
"version": "4.10.2", "version": "4.10.8",
"identifier": "in.cinny.app", "identifier": "wtf.ruv.paarrot",
"build": { "build": {
"frontendDist": "../cinny/dist", "frontendDist": "../cinny/dist",
"devUrl": "http://localhost:8080", "devUrl": "http://localhost:8080",
@@ -10,30 +10,19 @@
"beforeBuildCommand": "cd cinny && npm run build" "beforeBuildCommand": "cd cinny && npm run build"
}, },
"app": { "app": {
"windows": [ "withGlobalTauri": true,
{ "windows": [],
"title": "Cinny",
"width": 1280,
"height": 905,
"center": true,
"resizable": true,
"fullscreen": false,
"dragDropEnabled": false
}
],
"security": { "security": {
"csp": "script-src blob: data: filesystem: ws: wss: http: https: tauri: 'unsafe-eval' 'unsafe-inline' 'self'; img-src 'self' https: http: data: blob:" "csp": "script-src blob: data: filesystem: ws: wss: http: https: tauri: 'unsafe-eval' 'unsafe-inline' 'self'; img-src 'self' https: http: data: blob:"
} }
}, },
"plugins": { "plugins": {
"notification": {
"sound": true
},
"updater": { "updater": {
"endpoints": [ "endpoints": [
"http://synbox.ruv.wtf:8418/litruv/cinny-desktop/releases/download/latest/update.json" "http://synbox.ruv.wtf:8418/litruv/cinny-desktop/releases/download/latest/update.json"
], ],
"pubkey": "dW50cnVzdGVkIGNvbW1lbnQ6IG1pbmlzaWduIHB1YmxpYyBrZXk6IDExREU1NkVBMDY4MzcxMjAKUldRZ2NZTUc2bGJlRVNaQldnMXpJcHlocVpCWUNNaUdicjBGMVRsck1GQXhvTnJiOUNhVVRHSzQK" "pubkey": "dW50cnVzdGVkIGNvbW1lbnQ6IG1pbmlzaWduIHB1YmxpYyBrZXk6IDExREU1NkVBMDY4MzcxMjAKUldRZ2NZTUc2bGJlRVNaQldnMXpJcHlocVpCWUNNaUdicjBGMVRsck1GQXhvTnJiOUNhVVRHSzQK",
"dangerousInsecureTransportProtocol": true
} }
}, },
"bundle": { "bundle": {