From 06c4fc3e4d12bd40c5eda0f697560acf6907c913 Mon Sep 17 00:00:00 2001 From: FabianLars Date: Wed, 3 May 2023 07:03:49 +0000 Subject: [PATCH] Rename dev branch to v1 and next branch to v2 Committed via a GitHub action: https://github.com/tauri-apps/plugins-workspace/actions/runs/4869194441 Co-authored-by: FabianLars --- Cargo.toml | 22 ++++++ LICENSE.spdx | 20 +++++ LICENSE_APACHE-2.0 | 177 +++++++++++++++++++++++++++++++++++++++++++++ LICENSE_MIT | 21 ++++++ README.md | 49 +++++++++++++ banner.png | Bin 0 -> 47372 bytes src/lib.rs | 140 +++++++++++++++++++++++++++++++++++ 7 files changed, 429 insertions(+) create mode 100644 Cargo.toml create mode 100644 LICENSE.spdx create mode 100644 LICENSE_APACHE-2.0 create mode 100644 LICENSE_MIT create mode 100644 README.md create mode 100644 banner.png create mode 100644 src/lib.rs diff --git a/Cargo.toml b/Cargo.toml new file mode 100644 index 0000000..4e1f24d --- /dev/null +++ b/Cargo.toml @@ -0,0 +1,22 @@ +[package] +name = "tauri-plugin-persisted-scope" +version = "0.1.0" +description = "Save filesystem and asset scopes and restore them when the app is reopened." +authors.workspace = true +license.workspace = true +edition.workspace = true +rust-version.workspace = true + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] +serde.workspace = true +serde_json.workspace = true +tauri.workspace = true +log.workspace = true +thiserror.workspace = true +aho-corasick = "1.0" +bincode = "1" + +[features] +protocol-asset = [ "tauri/protocol-asset" ] \ No newline at end of file diff --git a/LICENSE.spdx b/LICENSE.spdx new file mode 100644 index 0000000..cdd0df5 --- /dev/null +++ b/LICENSE.spdx @@ -0,0 +1,20 @@ +SPDXVersion: SPDX-2.1 +DataLicense: CC0-1.0 +PackageName: tauri +DataFormat: SPDXRef-1 +PackageSupplier: Organization: The Tauri Programme in the Commons Conservancy +PackageHomePage: https://tauri.app +PackageLicenseDeclared: Apache-2.0 +PackageLicenseDeclared: MIT +PackageCopyrightText: 2019-2022, The Tauri Programme in the Commons Conservancy +PackageSummary: Tauri is a rust project that enables developers to make secure +and small desktop applications using a web frontend. + +PackageComment: The package includes the following libraries; see +Relationship information. + +Created: 2019-05-20T09:00:00Z +PackageDownloadLocation: git://github.com/tauri-apps/tauri +PackageDownloadLocation: git+https://github.com/tauri-apps/tauri.git +PackageDownloadLocation: git+ssh://github.com/tauri-apps/tauri.git +Creator: Person: Daniel Thompson-Yvetot \ No newline at end of file diff --git a/LICENSE_APACHE-2.0 b/LICENSE_APACHE-2.0 new file mode 100644 index 0000000..4947287 --- /dev/null +++ b/LICENSE_APACHE-2.0 @@ -0,0 +1,177 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS \ No newline at end of file diff --git a/LICENSE_MIT b/LICENSE_MIT new file mode 100644 index 0000000..4d75472 --- /dev/null +++ b/LICENSE_MIT @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2017 - Present Tauri Apps Contributors + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..4c38450 --- /dev/null +++ b/README.md @@ -0,0 +1,49 @@ +![plugin-persisted-scope](banner.png) + +Save filesystem and asset scopes and restore them when the app is reopened. + +## Install + +_This plugin requires a Rust version of at least **1.64**_ + +There are three general methods of installation that we can recommend. + +1. Use crates.io and npm (easiest, and requires you to trust that our publishing pipeline worked) +2. Pull sources directly from Github using git tags / revision hashes (most secure) +3. Git submodule install this repo in your tauri project and then use file protocol to ingest the source (most secure, but inconvenient to use) + +Install the Core plugin by adding the following to your `Cargo.toml` file: + +`src-tauri/Cargo.toml` + +```toml +[dependencies] +tauri-plugin-persisted-scope = { git = "https://github.com/tauri-apps/plugins-workspace", branch = "v1" } +``` + +## Usage + +First you need to register the core plugin with Tauri: + +`src-tauri/src/main.rs` + +```rust +fn main() { + tauri::Builder::default() + .plugin(tauri_plugin_persisted_scope::init()) + .run(tauri::generate_context!()) + .expect("error while running tauri application"); +} +``` + +Afterwards the plugin will automatically save and restore filesystem and asset scopes. + +## Contributing + +PRs accepted. Please make sure to read the Contributing Guide before making a pull request. + +## License + +Code: (c) 2015 - Present - The Tauri Programme within The Commons Conservancy. + +MIT or MIT/Apache 2.0 where applicable. diff --git a/banner.png b/banner.png new file mode 100644 index 0000000000000000000000000000000000000000..816f0c2978a2c33f75ab5d220c313f1a4608a34f GIT binary patch literal 47372 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 BhV1|V literal 0 HcmV?d00001 diff --git a/src/lib.rs b/src/lib.rs new file mode 100644 index 0000000..fe2cddf --- /dev/null +++ b/src/lib.rs @@ -0,0 +1,140 @@ +// Copyright 2021 Tauri Programme within The Commons Conservancy +// SPDX-License-Identifier: Apache-2.0 +// SPDX-License-Identifier: MIT + +use aho_corasick::AhoCorasick; +use serde::{Deserialize, Serialize}; +use tauri::{ + plugin::{Builder, TauriPlugin}, + AppHandle, FsScopeEvent, Manager, Runtime, +}; + +use std::{ + fs::{create_dir_all, File}, + io::Write, + path::Path, +}; + +const SCOPE_STATE_FILENAME: &str = ".persisted-scope"; + +// Most of these patterns are just added to try to fix broken files in the wild. +// After a while we can hopefully reduce it to something like [r"[?]", r"[*]", r"\\?\\\?\"] +const PATTERNS: &[&str] = &[ + r"[[]", + r"[]]", + r"[?]", + r"[*]", + r"\?\?", + r"\\?\\?\", + r"\\?\\\?\", +]; +const REPLACE_WITH: &[&str] = &[r"[", r"]", r"?", r"*", r"\?", r"\\?\", r"\\?\"]; + +#[derive(Debug, thiserror::Error)] +enum Error { + #[error(transparent)] + Io(#[from] std::io::Error), + #[error(transparent)] + Tauri(#[from] tauri::Error), + #[error(transparent)] + TauriApi(#[from] tauri::api::Error), + #[error(transparent)] + Bincode(#[from] Box), +} + +#[derive(Debug, Default, Deserialize, Serialize)] +struct Scope { + allowed_paths: Vec, + forbidden_patterns: Vec, +} + +fn fix_pattern(ac: &AhoCorasick, s: &str) -> String { + let s = ac.replace_all(s, REPLACE_WITH); + + if ac.find(&s).is_some() { + return fix_pattern(ac, &s); + } + + s +} + +fn save_scopes(app: &AppHandle, app_dir: &Path, scope_state_path: &Path) { + let fs_scope = app.fs_scope(); + + let scope = Scope { + allowed_paths: fs_scope + .allowed_patterns() + .into_iter() + .map(|p| p.to_string()) + .collect(), + forbidden_patterns: fs_scope + .forbidden_patterns() + .into_iter() + .map(|p| p.to_string()) + .collect(), + }; + + let _ = create_dir_all(app_dir) + .and_then(|_| File::create(scope_state_path)) + .map_err(Error::Io) + .and_then(|mut f| { + f.write_all(&bincode::serialize(&scope).map_err(Error::from)?) + .map_err(Into::into) + }); +} + +pub fn init() -> TauriPlugin { + Builder::new("persisted-scope") + .setup(|app| { + let fs_scope = app.fs_scope(); + #[cfg(feature = "protocol-asset")] + let asset_protocol_scope = app.asset_protocol_scope(); + let app = app.clone(); + let app_dir = app.path_resolver().app_data_dir(); + + if let Some(app_dir) = app_dir { + let scope_state_path = app_dir.join(SCOPE_STATE_FILENAME); + + let _ = fs_scope.forbid_file(&scope_state_path); + #[cfg(feature = "protocol-asset")] + let _ = asset_protocol_scope.forbid_file(&scope_state_path); + + // We're trying to fix broken .persisted-scope files seamlessly, so we'll be running this on the values read on the saved file. + // We will still save some semi-broken values because the scope events are quite spammy and we don't want to reduce runtime performance any further. + let ac = AhoCorasick::new(PATTERNS).unwrap(/* This should be impossible to fail since we're using a small static input */); + + if scope_state_path.exists() { + let scope: Scope = tauri::api::file::read_binary(&scope_state_path) + .map_err(Error::from) + .and_then(|scope| bincode::deserialize(&scope).map_err(Into::into)) + .unwrap_or_default(); + for allowed in &scope.allowed_paths { + let allowed = fix_pattern(&ac, allowed); + + let _ = fs_scope.allow_file(&allowed); + #[cfg(feature = "protocol-asset")] + let _ = asset_protocol_scope.allow_file(&allowed); + } + for forbidden in &scope.forbidden_patterns { + let forbidden = fix_pattern(&ac, forbidden); + + let _ = fs_scope.forbid_file(&forbidden); + #[cfg(feature = "protocol-asset")] + let _ = asset_protocol_scope.forbid_file(&forbidden); + } + + // Manually save the fixed scopes to disk once. + // This is needed to fix broken .peristed-scope files in case the app doesn't update the scope itself. + save_scopes(&app, &app_dir, &scope_state_path); + } + + fs_scope.listen(move |event| { + if let FsScopeEvent::PathAllowed(_) = event { + save_scopes(&app, &app_dir, &scope_state_path); + } + }); + } + Ok(()) + }) + .build() +}