From c84e15ba20ce66873e84404eae97f2983f2b8e2f Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 8 Jul 2024 04:33:23 +0000 Subject: [PATCH 1/4] chore(main): release 1.0.0 --- CHANGELOG.md | 147 ++++++++++++++++++++++++++++++++++++++++++++++ package-lock.json | 4 +- package.json | 2 +- 3 files changed, 150 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index fd4860f7b..5e1496877 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,152 @@ # Changelog +## 1.0.0 (2024-07-08) + + +### Features + +* add (pt-br) translation for system settings. ([77211c4](https://github.com/HeyPuter/puter/commit/77211c4f71b0285fb3060f7e5c8d493b4d7c4f0c)) +* add /group/list endpoint ([d55f38c](https://github.com/HeyPuter/puter/commit/d55f38ca68899c3574cfe328d2b206b1143ff0d4)) +* add /share/file-by-username endpoint ([5d214c7](https://github.com/HeyPuter/puter/commit/5d214c7b52887b594af6be497f1892baf7d77679)) +* add /sharelink/request endpoint ([742f625](https://github.com/HeyPuter/puter/commit/742f625309f9f4cfa70cf7d2fe5b03fd164913ea)) +* add /show urls ([079e25a](https://github.com/HeyPuter/puter/commit/079e25a9fe8e179f26d72378856058eb656e2314)) +* add app metadata ([f7216b9](https://github.com/HeyPuter/puter/commit/f7216b95672b38802b288ef5b022e947017ff311)) +* add appdata permission (if applicable) on app share ([9751fd9](https://github.com/HeyPuter/puter/commit/9751fd92a50e75385cffed0ca847d5076ba98c92)) +* add cookie for site token ([a813fbb](https://github.com/HeyPuter/puter/commit/a813fbbb88bcfb8b9a61976e2a4fc4aab943fc88)) +* add cross-server event broadcasting ([1207a15](https://github.com/HeyPuter/puter/commit/1207a158bdc88a90b14d31d03387ce353c176a9c)) +* add debug mod ([16b1649](https://github.com/HeyPuter/puter/commit/16b1649ff62fd87a4dda5d2e1c68941c864c5da4)) +* add endpoints for share tokens ([301ffaf](https://github.com/HeyPuter/puter/commit/301ffaf61dbb4fca1a855650ab80707ae6d9f602)) +* Add exit status code to apps ([7674da4](https://github.com/HeyPuter/puter/commit/7674da4cd225bcad34079251c5600fc32e32248b)) +* add external mod loading ([eb05fbd](https://github.com/HeyPuter/puter/commit/eb05fbd2dc4877553b5118a069a9afdc32bea137)) +* add group management endpoints ([4216346](https://github.com/HeyPuter/puter/commit/4216346384d90dcba429dbcb175e6f86482d19f4)) +* add group permission endpoints ([c374b0c](https://github.com/HeyPuter/puter/commit/c374b0cbca761e7c8a47d56a09551f2e9378066a)) +* add mark-read endpoint ([0101f42](https://github.com/HeyPuter/puter/commit/0101f425d480705c20df4919a76f66e987f5790f)) +* add permission rewriter for app by name ([16c4907](https://github.com/HeyPuter/puter/commit/16c4907be592dae31ed3c1aa3fac3b9655255d6f)) +* add protected apps ([f2f3d6f](https://github.com/HeyPuter/puter/commit/f2f3d6ff460932698fb8da7309fbce3e96132950)) +* add protected subdomains ([86fca17](https://github.com/HeyPuter/puter/commit/86fca17fb17c0c24397c29b49b133deadea1de8b)) +* add querystring-informed errors ([e7c0b83](https://github.com/HeyPuter/puter/commit/e7c0b8320a6829315d9154d6d513bab4491c47ea)) +* add readdir delegate for shares in a user directory ([8424d44](https://github.com/HeyPuter/puter/commit/8424d446099ac30ccf829c57d43eef1f235618e4)) +* add readdir delegate for sharing user homedirs ([19a5eb0](https://github.com/HeyPuter/puter/commit/19a5eb00763f3ac31df8483fb59cb7a96c448745)) +* add service for notifications ([a1e6887](https://github.com/HeyPuter/puter/commit/a1e6887bf93da21b9482040b3e30ee083fb23477)) +* add service to test file share logic ([332371f](https://github.com/HeyPuter/puter/commit/332371fccb198462948a440419adc7a26d671a23)) +* add share list to stat ([8c49ba2](https://github.com/HeyPuter/puter/commit/8c49ba2553ce6bee20eb5b6f2721bc80f639e98a)) +* add share service and share-by-email to /share ([db5990a](https://github.com/HeyPuter/puter/commit/db5990a98935817c0e16d30e921bb99c57a98fc8)) +* add subdomain permission (if applicable) on app share ([13e2f72](https://github.com/HeyPuter/puter/commit/13e2f72c9f33f485570f13f45341246b1a05879f)) +* add user-group permission check ([0014940](https://github.com/HeyPuter/puter/commit/00149402e041443aa3ac571fbe97a9a85f95564b)) +* **backend:** add script service ([30550fc](https://github.com/HeyPuter/puter/commit/30550fcddda18469735499546de502d29b85e2ad)) +* **backend:** Add tab completion to server console command arguments ([fa81dca](https://github.com/HeyPuter/puter/commit/fa81dca9507b7fa0f82099b75f2ab89c865626ac)) +* **backend:** Add tab-completion to server console command names ([e1e76c6](https://github.com/HeyPuter/puter/commit/e1e76c6be71fdeb3b6246307b626734d8dc26f86)) +* **backend:** add tip of day ([2d8e624](https://github.com/HeyPuter/puter/commit/2d8e6240c61dc6301f49cbdcd1c3b04736f9ca93)) +* **backend:** allow services to provide user properties ([522664d](https://github.com/HeyPuter/puter/commit/522664d415c33342500defec309c2ff15bc94804)) +* **backend:** allow services to provide whoami values ([fccabf1](https://github.com/HeyPuter/puter/commit/fccabf1bc0c4418f3599222616dd63bf98c14fe1)) +* **backend:** improve logger and reduce logs ([4bdad75](https://github.com/HeyPuter/puter/commit/4bdad75766d0617a164024b39b79bf5373c495a6)) +* Display app icon and description in embeds ([ef298ce](https://github.com/HeyPuter/puter/commit/ef298ce3aa3ce90224e883fb0ba33f9cd3a3da44)) +* get first test working on share-test service ([88d6bee](https://github.com/HeyPuter/puter/commit/88d6bee9546f36d689c53ec7fe95f01f772f5211)) +* **git:** Add --color and --no-color options ([d6dd1a5](https://github.com/HeyPuter/puter/commit/d6dd1a5bb0a2b2bba2cfe86d2e51ff2a6e42841c)) +* **git:** Add a --debug option, which sets the DEBUG global ([fa3df72](https://github.com/HeyPuter/puter/commit/fa3df72f6ed2d45a440ebc2aacbbae67bf042478)) +* **git:** Add authentication to clone, fetch, and pull. ([364d580](https://github.com/HeyPuter/puter/commit/364d580ff896691ee70d3735f495c720651a9f41)) +* **git:** Add diff display to `show` and `log` subcommands ([3cad1ec](https://github.com/HeyPuter/puter/commit/3cad1ec436f99a78f782ab9576325d4341284964)) +* **git:** Add start-revision and file arguments to `git log` ([49c2f16](https://github.com/HeyPuter/puter/commit/49c2f163515d2130c17a6f6a6a16bc27ea69336a)) +* **git:** Allow checking out a commit instead of a branch ([057b3ac](https://github.com/HeyPuter/puter/commit/057b3acf00af49c005b9bf7069c5d22983a32e1e)) +* **git:** Color output for `git status` files ([bab5204](https://github.com/HeyPuter/puter/commit/bab5204209aa2efc0c053643677a78db6ede0929)) +* **git:** Display file contents as a string for `git show FILE_OID` ([a680371](https://github.com/HeyPuter/puter/commit/a68037111a04580cfa2688694a68ef6ac7a495fa)) +* **git:** Display ref names in `git log` and `git show` ([45cdfcb](https://github.com/HeyPuter/puter/commit/45cdfcb5bfa66937b33054a127e0b17001f3faa4)) +* **git:** Format output closer to canonical git ([60976b1](https://github.com/HeyPuter/puter/commit/60976b1ed61984d9d290f3a0ae99dd97632e9909)) +* **git:** Handle detached HEAD in `git status` and `git branch --list` ([2c9b1a3](https://github.com/HeyPuter/puter/commit/2c9b1a3ffc3d5e282ffe5b83a86314e99445bbc6)) +* **git:** Implement `git branch` ([ad4f132](https://github.com/HeyPuter/puter/commit/ad4f13255d52f8226f22800c16b388cf0e6384d7)) +* **git:** Implement `git checkout` ([35e4453](https://github.com/HeyPuter/puter/commit/35e4453930bc4e151887f83c97efec19cc15da70)) +* **git:** Implement `git cherry-pick` ([2e4259d](https://github.com/HeyPuter/puter/commit/2e4259d267b3cfafd5cefc57a02643c6432fec4d)) +* **git:** Implement `git clone` ([95c8235](https://github.com/HeyPuter/puter/commit/95c8235a4a1fea39a46c40df04cb1004a2fe7b23)) +* **git:** Implement `git diff` ([622b6a9](https://github.com/HeyPuter/puter/commit/622b6a9b921c3c03efc0b519c9a26c6701d80e50)) +* **git:** Implement `git fetch` ([98a4b9e](https://github.com/HeyPuter/puter/commit/98a4b9ede39b94c0c6b6b8345d7551359961186a)) +* **git:** Implement `git pull` ([eb2b6a0](https://github.com/HeyPuter/puter/commit/eb2b6a08b03cee0612885412cd4b03c9564044e3)) +* **git:** Implement `git push` ([8c70229](https://github.com/HeyPuter/puter/commit/8c70229a188b743220db076a740a992fd7971301)) +* **git:** Implement `git remote` ([43ce0d5](https://github.com/HeyPuter/puter/commit/43ce0d5b45d4eb4f296afcaaa1ecadc125c53e89)) +* **git:** Implement `git restore` ([4ba8a32](https://github.com/HeyPuter/puter/commit/4ba8a32b45d395f28433572db5644d630776789e)) +* **git:** Make `git add` work for deleted files ([9551544](https://github.com/HeyPuter/puter/commit/955154468f48e45028dad2e916708d6a763affad)) +* **git:** Make shorten_hash() guaranteed to produce a unique hash ([dd10a37](https://github.com/HeyPuter/puter/commit/dd10a377493c0d8f10a1ac8779dc27f3f3bf6c37)) +* **git:** Resolve more forms of commit reference ([b6906bb](https://github.com/HeyPuter/puter/commit/b6906bbcaaa50fc8a8c60beb6d2d38bcb7dda758)) +* **git:** Understand references like `HEAD^` and `main~3` ([711dbc0](https://github.com/HeyPuter/puter/commit/711dbc0d2fde9c2ddc6c86f64fb4caa7837c9dcb)) +* implicit access from apps to shared appdata dirs ([31d4eb0](https://github.com/HeyPuter/puter/commit/31d4eb090efb340fdfb7cb6b751145e859624eeb)) +* introduce notification selection via driver ([c5334b0](https://github.com/HeyPuter/puter/commit/c5334b0e19cf9762f536ec482c3ff872e9c12399)) +* multi-recipient multi-file share endpoint ([846fdc2](https://github.com/HeyPuter/puter/commit/846fdc20d4a887a1f8a4f3bda4fafe41efab2733)) +* **parsely:** Add a fail() parser ([5656d9d](https://github.com/HeyPuter/puter/commit/5656d9d42f76202a534ad640d3a4e287e0e40418)) +* **parsely:** Add stringUntil() parser ([d46b043](https://github.com/HeyPuter/puter/commit/d46b043c5d16f1205d61de3f3ba43ed8ad7bff93)) +* **phoenix:** Add --dump and --file options to sed ([f250f86](https://github.com/HeyPuter/puter/commit/f250f86446a506f24fa2ad396328e3a2212a68d0)) +* **phoenix:** Add more commands to sed, including labels and branching ([306014a](https://github.com/HeyPuter/puter/commit/306014adc77a7ca155feb95d1146cb46ee075b52)) +* **phoenix:** Expose parsed arg tokens to apps that request them ([4067c82](https://github.com/HeyPuter/puter/commit/4067c82486c99cad20f41927ad39ebea438b717f)) +* **phoenix:** Implement an `exit` builtin ([3184d34](https://github.com/HeyPuter/puter/commit/3184d3482c7b95c0fd1fc0745555ff82fc9a8c99)) +* **phoenix:** Implement parsing of sed scripts ([0d4f907](https://github.com/HeyPuter/puter/commit/0d4f907b6675b15bd50a55f50aa28f0803b18b7b)) +* **phoenix:** Make `clear` clear scrollback unless `-x` is given ([75a989a](https://github.com/HeyPuter/puter/commit/75a989a7b69bfdfdf69e5f0365027c5b27d8bfc6)) +* **Phoenix:** Pass command line arguments and ENV when launching apps ([8f1c4fc](https://github.com/HeyPuter/puter/commit/8f1c4fcda98e72a7b970e8c6fc2fe39a5e012264)) +* **phoenix:** Respond to exit status codes ([5de3052](https://github.com/HeyPuter/puter/commit/5de305202656a172b187dac87543d6c1c69a2958)) +* **phoenix:** Show actual host name in prompt and neofetch ([4539408](https://github.com/HeyPuter/puter/commit/4539408a218a50244dc615cf7de56c29dcac53e6)) +* rate-limit for excessive groups ([4af279a](https://github.com/HeyPuter/puter/commit/4af279a72fc9de89ddc3ba51806ca3760a36265d)) +* re-send unreads on login ([02fc4d8](https://github.com/HeyPuter/puter/commit/02fc4d86b7166fb4803be5d28e2a593d6b7d9785)) +* register dev center to apps ([10f4d7d](https://github.com/HeyPuter/puter/commit/10f4d7d50ce9314f9c3888c74cb17c8ebbecee98)) +* send notification when file gets shared ([2f6c428](https://github.com/HeyPuter/puter/commit/2f6c428a403a006f7878861d2f0356c3294519be)) +* start directory index frame ([fb1e2f2](https://github.com/HeyPuter/puter/commit/fb1e2f21fb67aefe0602f6c978199c7cd019bbf7)) +* support canonical puter.js url in dev ([fd41ae2](https://github.com/HeyPuter/puter/commit/fd41ae217c7a9f7229326f62a829471580a744bd)) +* **ui:** add new components ([577bd59](https://github.com/HeyPuter/puter/commit/577bd59b6cc94810e851ad544f8234e25a4e6e27)) +* **ui:** add new components ([38ba425](https://github.com/HeyPuter/puter/commit/38ba42575ce9f3506f8ce219b9580202b3ed9993)) +* **ui:** allow component-based settings tabs ([1245960](https://github.com/HeyPuter/puter/commit/124596058a286241b51dd87ce2fc1a68478cb5b8)) +* update share endpoint to support more things ([dd5fde5](https://github.com/HeyPuter/puter/commit/dd5fde5130c1840ab598e6622766ae835142e58a)) + + +### Bug Fixes + +* add app_uid param to kv interface ([f7a0549](https://github.com/HeyPuter/puter/commit/f7a054956b8739a3bc305a49faee929ea0da1e15)) +* add missing columns for public directory update ([b10302a](https://github.com/HeyPuter/puter/commit/b10302ad744fd9c58f9735743e075815183c772c)) +* Add missing file extension to 0009_app-prefix-fix.sql in DB init ([a8160a8](https://github.com/HeyPuter/puter/commit/a8160a8cdcdd6aff98728a6f1643d93386e6bb5a)) +* add permission implicator for file modes ([e63ab3a](https://github.com/HeyPuter/puter/commit/e63ab3a67f6555eb13d6af477a8da9f1b54d6608)) +* add stream limit ([ceba309](https://github.com/HeyPuter/puter/commit/ceba309dbd4df89f310d1a530f939a5b7991f4c7)) +* **backend:** remove a bad thing that really doesn't work ([8d22276](https://github.com/HeyPuter/puter/commit/8d22276f13106f7642d11da30b1500817a20ad43)) +* bug introduced when refactoring /share to Sequence ([ecb9978](https://github.com/HeyPuter/puter/commit/ecb997885c1efb766827c84d2ffb8dc6ddabe992)) +* check subdomain earlier for /apps ([4e3a24e](https://github.com/HeyPuter/puter/commit/4e3a24e6093e279e210765e07e436f4e63b74072)) +* column nullability blunder ([1429d6f](https://github.com/HeyPuter/puter/commit/1429d6f57c67dff51fc41ca0c2868f8d000845f1)) +* Correct APIError imports ([062e23b](https://github.com/HeyPuter/puter/commit/062e23b5c9673db1f8b0ff0469289d52dd1e3f99)) +* correct shown flag behavior ([632c536](https://github.com/HeyPuter/puter/commit/632c5366161ff8fbbd4d60c61dfbe52dad488a2c)) +* database migration ([9b39309](https://github.com/HeyPuter/puter/commit/9b39309e18a2927d25fe794d91da4e4d068c4bca)) +* do not delegate to select on read like ever that is really dumb ([a2a10b9](https://github.com/HeyPuter/puter/commit/a2a10b94be59403e03fb08bec5d7c056ce5b554f)) +* docker runtime fail because stdout columns ([94c0449](https://github.com/HeyPuter/puter/commit/94c0449437ce4cb26d00a15a3f277bc7b09367b4)) +* fix issues with apps in /share endpoint ([0cf90ee](https://github.com/HeyPuter/puter/commit/0cf90ee39af6548d271dec45ed8ee9e6df1cd14d)) +* fix owner ids for default apps ([283f409](https://github.com/HeyPuter/puter/commit/283f409a662d126e7f3ce811f1467ac6fab9a522)) +* fix permission cascade properly this time ([de58866](https://github.com/HeyPuter/puter/commit/de5886698e1eae2b250baac174b57029f3244e96)) +* Fix phoenix app prefix and TokenService test ([afb9d86](https://github.com/HeyPuter/puter/commit/afb9d866b5091058711db931cde904947e661c15)) +* fix that fix ([b126b67](https://github.com/HeyPuter/puter/commit/b126b670940a0e20cfe7bd0eba3db891bab5c142)) +* fix typo ([ce328b7](https://github.com/HeyPuter/puter/commit/ce328b7245ad741b64c5885f64f806fc98a55d84)) +* **git:** Make git commit display detached HEAD correctly ([73d0f5a](https://github.com/HeyPuter/puter/commit/73d0f5a90cb5dcbadfc6d0fd22f14e8bc0e61f86)) +* group permission audit table ([7d2f6d2](https://github.com/HeyPuter/puter/commit/7d2f6d256f56e30d752e9999c6e8bde68f9d9637)) +* handle subpaths under another user ([d128cee](https://github.com/HeyPuter/puter/commit/d128ceed6f4928fa0793815feb2e2715cd273ff8)) +* handling of batch requests with zero files ([c0063a8](https://github.com/HeyPuter/puter/commit/c0063a871fd891a1774f1bee00e86170fed249fa)) +* i forgot to test reloading ([7eabb43](https://github.com/HeyPuter/puter/commit/7eabb43bd4257b4129d67eaeda2aa27e8268dc78)) +* improve console experience on mac ([15465bf](https://github.com/HeyPuter/puter/commit/15465bfc5035a64762f7c86a3d38af8be6be5b59)) +* incorrect error from suggested_apps ([b648817](https://github.com/HeyPuter/puter/commit/b648817f2743c2b6214ebe4177d921c9b9027594)) +* Make polyfilled import.meta.filename getter a valid function ([85c6798](https://github.com/HeyPuter/puter/commit/85c679844869b6b05fcbda231d8dc7026a66da97)) +* null email in request to /share ([bf63144](https://github.com/HeyPuter/puter/commit/bf63144f7a79c48bd650ae851ddd0c8a10d748c3)) +* Only run Component initialization functions once ([5b43358](https://github.com/HeyPuter/puter/commit/5b43358219402bee3eadf4a0f184a4b924d3293b)) +* oops ([a136ee5](https://github.com/HeyPuter/puter/commit/a136ee5edd3149798a0d82f494f423f503b65f00)) +* **parsely:** Make Repeat parser work when no separator is given ([9b4d16f](https://github.com/HeyPuter/puter/commit/9b4d16fbe9d5698c57f9da725a22b528a7d7cac2)) +* peers array assumption ([10cbf08](https://github.com/HeyPuter/puter/commit/10cbf08233620440aa39f5302deaac4f59f02247)) +* **phoenix:** Add missing newlines to sed command output ([e047b0b](https://github.com/HeyPuter/puter/commit/e047b0bf302284da61e677432e4cc25b531b24f2)) +* **phoenix:** Gracefully handle completing a non-existent path ([d76e713](https://github.com/HeyPuter/puter/commit/d76e7130cba9f0ca05940abafe4fd1a41464aa83)) +* property validation on some permission endpoints ([0855f2b](https://github.com/HeyPuter/puter/commit/0855f2b36eca3bbdaa8429cbde3aa1242e8e96ee)) +* readdir on file ([a72ec97](https://github.com/HeyPuter/puter/commit/a72ec9799ac3bd76ceafa22cce149e373a13f3b9)) +* remove last component when share URL is file ([1166e69](https://github.com/HeyPuter/puter/commit/1166e69c76688d1811701c56cd4df9d38e286793)) +* remove legacy permission check in stat ([f2c6e01](https://github.com/HeyPuter/puter/commit/f2c6e01296e4214336e63bc2d69bcbf17f59890f)) +* Remove null or duplicate app entries from suggest_app_for_fsentry() ([6900233](https://github.com/HeyPuter/puter/commit/6900233c5aaa2d1a49f495e9f9a060796757a91e)) +* **security:** Move token for socket.io to request body ([49b257e](https://github.com/HeyPuter/puter/commit/49b257ecffbb1e12090b86a67528a5ad09da69db)) +* switch share notif username to sender ([cd65217](https://github.com/HeyPuter/puter/commit/cd65217f5cda1c986ee231e2eeeef5abefa36ecb)) +* **Terminal:** Accept input from Chrome on Android ([4ef3e53](https://github.com/HeyPuter/puter/commit/4ef3e53de34f0097950a7e707ca2483863beafb5)) +* Throw an error when readdir is called on a non-directory ([46eb4ed](https://github.com/HeyPuter/puter/commit/46eb4ed2b96c235e10e15645a30d2f192a1af0de)) +* type error in puter-site ([d96f924](https://github.com/HeyPuter/puter/commit/d96f924cad7a13ea6e9084bb0ebb79ecc5fcb8a3)) +* ui color input attributes ([d9c4fbb](https://github.com/HeyPuter/puter/commit/d9c4fbbd1dcce12ee05ee33652a5fa518196463d)) +* **ui:** improve Component base class ([f8780d0](https://github.com/HeyPuter/puter/commit/f8780d032b10138851c22af53b8610c578139acc)) +* update email share object ([9033f6f](https://github.com/HeyPuter/puter/commit/9033f6f8c74ef8739294d640ac1c7eba95519bbd)) +* update PD alert custom details ([2f16322](https://github.com/HeyPuter/puter/commit/2f163221bdde09425cae11ef7f8e4eb0b10c7103)) +* update test kernel ([55c609b](https://github.com/HeyPuter/puter/commit/55c609b3fec4ef018febc6e88c44a6277960d728)) +* validate size metadata ([2008db0](https://github.com/HeyPuter/puter/commit/2008db08524259264a0c8186a34fc75d7a133f5f)) + ## 2.3.0 (2024-05-22) diff --git a/package-lock.json b/package-lock.json index e09fb8ad0..3954e7fa8 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "puter.com", - "version": "2.3.0", + "version": "1.0.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "puter.com", - "version": "2.3.0", + "version": "1.0.0", "license": "AGPL-3.0-only", "workspaces": [ "src/*" diff --git a/package.json b/package.json index e5cef97af..7241c5f84 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "puter.com", - "version": "2.3.0", + "version": "1.0.0", "author": "Puter Technologies Inc.", "license": "AGPL-3.0-only", "description": "Desktop environment in the browser!", From 1f659f7c016c8357f9f2608caa12b4f6ab31408a Mon Sep 17 00:00:00 2001 From: KernelDeimos Date: Mon, 8 Jul 2024 13:45:57 -0400 Subject: [PATCH 2/4] chore: fix release-please version --- CHANGELOG.md | 2 +- src/gui/src/package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 5e1496877..95e49d11f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,6 @@ # Changelog -## 1.0.0 (2024-07-08) +## 2.4.0 (2024-07-08) ### Features diff --git a/src/gui/src/package.json b/src/gui/src/package.json index e6e0bc581..e273f7ce9 100644 --- a/src/gui/src/package.json +++ b/src/gui/src/package.json @@ -1,6 +1,6 @@ { "name": "@heyputer/gui", - "version": "2.3.0", + "version": "2.4.0", "author": "Puter Technologies Inc.", "license": "AGPL-3.0-only", "description": "Desktop environment in the browser!", From 17145d0be6a9a1445947cc0c4bec8f16a475144c Mon Sep 17 00:00:00 2001 From: Yuliya Tolstikova <66835926+julijatol@users.noreply.github.com> Date: Mon, 8 Jul 2024 15:12:48 -0400 Subject: [PATCH 3/4] Update ru.js issue #547 --- src/gui/src/i18n/translations/ru.js | 218 ++++++++++++++++++++-------- 1 file changed, 154 insertions(+), 64 deletions(-) diff --git a/src/gui/src/i18n/translations/ru.js b/src/gui/src/i18n/translations/ru.js index 77779cdf1..dadfe7123 100644 --- a/src/gui/src/i18n/translations/ru.js +++ b/src/gui/src/i18n/translations/ru.js @@ -22,98 +22,132 @@ const ru = { code: "ru", dictionary: { about: "О системе", - account: "Учетная Запись", - access_granted_to: "Доступ Предоставлен", - add_existing_account: "Добавить Существующую Учетную Запись", - all_fields_required: 'Все поля обязательны.', + account: "Учетная запись", + account_password: "Подтвердите пароль", + access_granted_to: "Доступ предоставлен", + add_existing_account: "Добавить существующую Учетную запись", + all_fields_required: 'Все поля обязательны для заполнения.', + allow: 'Разрешить', apply: "Применить", ascending: 'По возрастанию', + associated_websites: "Связанные сайты", auto_arrange: 'Автоупорядочивание', background: "Фон", browse: "Пролистать", cancel: 'Отмена', center: 'Отцентровать', change_desktop_background: 'Сменить фон рабочего стола…', - change_email: "Сменить Email", - change_language: "Сменить Язык", - change_password: "Сменить Пароль", - change_ui_colors: "Сменить Тему Оформления", - change_username: "Сменить Имя Пользователя", + change_email: "Изменить электронныю почту", + change_language: "Изменить язык", + change_password: "Изменить пароль", + change_ui_colors: "Изменить тему оформления", + change_username: "Изменить имя пользователя", close: 'Закрыть', - close_all_windows: "Закрыть Все Окна", + close_all_windows: "Закрыть все окна", close_all_windows_confirm: "Вы уверены, что хотите закрыть все окна?", - close_all_windows_and_log_out: 'Закрыть Окна и Выйти', - change_always_open_with: "Хотите всегда открывать файлы этого типа в", + close_all_windows_and_log_out: 'Закрыть все окна и выйти', + change_always_open_with: "Хотите всегда открывать файлы этого типа с помощью", color: 'Цвет', + confirm: 'Подтвердить', hue: 'Цветовая Гамма', + confirm_2fa_setup: 'Я добавил код в приложение для аутентификации', + confirm_2fa_recovery: 'Я сохранил коды восстановления доступа в безопасном месте', confirm_account_for_free_referral_storage_c2a: 'Создайте учетную запись и подтвердите свой адрес электронной почты, чтобы получить 1 Гб бесплатного дискового пространства. Ваш друг также получит 1 Гб бесплатного дискового пространства.', + confirm_code_generic_incorrect: "Неверный код.", + confirm_code_generic_too_many_requests: "Слишком много запросов. Пожалуйста, подождите несколько минут.", + confirm_code_generic_submit: "Отправить код", + confirm_code_generic_try_again: "Попробуйте снова", + confirm_code_generic_title: "Введите код подтверждения", + confirm_code_2fa_instruction: "Введите 6-значный код из приложения для аутентификации.", + confirm_code_2fa_submit_btn: "Отправить", + confirm_code_2fa_title: "Введите код аутентификации", confirm_delete_multiple_items: 'Вы уверены, что хотите навсегда удалить эти элементы?', confirm_delete_single_item: 'Вы уверены, что хотите навсегда удалить этот элемент?', confirm_open_apps_log_out: 'У вас имеются открытые приложения. Вы уверены, что хотите выйти из системы?', - confirm_new_password: "Подтвердите Новый Пароль", + confirm_new_password: "Подтвердите новый пароль", confirm_delete_user: "Вы уверены, что хотите удалить свою учетную запись? Все ваши файлы и данные будут удалены безвозвратно. Это действие нельзя отменить.", - confirm_delete_user_title: "Удалить Учетную Запись?", - confirm_session_revoke: "Вы уверены, что хотите отозвать эту сессию?", + confirm_delete_user_title: "Удалить учетную запись?", + confirm_session_revoke: "Вы уверены, что хотите отменить эту сессию?", contact_us: "Связаться с нами", + contact_us_verification_required: "Подтвердите адрес электронной почты чтобы продожить.", contain: 'Содержание', continue: "Продолжить", copy: 'Копировать', - copy_link: "Копировать Ссылку", - copying: "Копируется", + copy_link: "Скопировать ссылку", + copying: "Создаю копию", + copying_file: "Создаю копию %%", cover: 'Обложка', - create_account: "Создать Учетную Запись", - create_free_account: "Создать Бесплатную Учетную Запись", - create_shortcut: "Создать Ярлык", - credits: "Титры", - current_password: "Текущий Пароль", + create_account: "Создать учетную запись", + create_free_account: "Создать бесплатную учетную запись", + create_shortcut: "Создать ярлык", + credits: "Авторы", + current_password: "Текущий пароль", cut: 'Вырезать', clock: "Часы", clock_visible_hide: 'Скрыть - Всегда скрыто', clock_visible_show: 'Показать - Всегда на виду', clock_visible_auto: 'Авто - По Умолчанию, видно только в полноэкранном режиме.', + close_all: 'Закрыть все', + created: 'Создано', date_modified: 'Дата изменения', default: 'По умолчанию', delete: 'Удалить', - delete_account: "Удалить Учетную Запись", - delete_permanently: "Удалить Безвозвратно", + delete_account: "Удалить учетную запись", + delete_permanently: "Удалить безвозвратно", + deleting_file: "Удаление %%", deploy_as_app: 'Развернуть как приложение', descending: 'По убыванию', + desktop: 'Рабочий стол', desktop_background_fit: "Вместить", developers: "Разработчики", dir_published_as_website: `%strong% опубликован в:`, - disassociate_dir: "Отключать Директорию", + disable_2fa: 'Отключить двойную аутентификацию', + disable_2fa_confirm: "Вы уверены, что хотите отключить двойную аутентификацию?", + disable_2fa_instructions: "Введите пароль чтобы отключить двойную аутентификацию.", + disassociate_dir: "Отключить директорию", + documents: 'Документы', + dont_allow: 'Доступ запрещён', download: 'Загрузить', - download_file: 'Загрузить Файл', - downloading: "Загружается", - email: "Email", + download_file: 'Загрузить файл', + downloading: "Загрузка", + email: "Электронная почта", email_change_confirmation_sent: "На ваш новый адрес электронной почты было отправлено письмо с подтверждением. Пожалуйста, проверьте свой ящик электронной почты и следуйте инструкциям, чтобы завершить процесс.", email_invalid: 'Адрес электронной почты недействителен.', - email_or_username: "Email или Имя Пользователя", + email_or_username: "Email или Имя пользователя", email_required: 'Email обязателен.', - empty_trash: 'Очистить Корзину', + empty_trash: 'Очистить корзину', empty_trash_confirmation: `Вы уверены, что хотите навсегда удалить элементы из Корзины?`, emptying_trash: 'Очистка Корзины…', - end_hard: "Закрыть жестко", + enable_2fa: 'Включить двойную аутентификацию', + end_hard: "Принудительно закрыть", end_process_force_confirm: "Вы уверены, что хотите принудительно завершить этот процесс?", - end_soft: "Закрыть мягко", + end_soft: "Закрыть", + enlarged_qr_code: "Увеличить QR код", enter_password_to_confirm_delete_user: "Введите пароль для подтверждения удаления учетной записи", + error_message_is_missing: "Сообщение об ошибке отсутствует.", + error_unknown_cause: "Неизвестная ошибка.", + error_uploading_files: "Не удалось загрузить файлы", + favorites: "Избранное", feedback: "Обратная связь", feedback_c2a: "Пожалуйста, используйте форму ниже, чтобы отправить нам свои отзывы, комментарии и сообщения об ошибках.", feedback_sent_confirmation: "Спасибо, что связались с нами. Если у вас есть электронная почта, связанная с вашим аккаунтом, мы ответим вам как можно скорее.", fit: "Вместить", - force_quit: 'Принудительно Закрыть', + folder: 'Папка', + force_quit: 'Принудительно закрыть', forgot_pass_c2a: "Забыли пароль?", from: "От", - general: "Общий", + general: "Общее", get_a_copy_of_on_puter: `Получите копию '%%' на Puter.com!`, - get_copy_link: 'Получить Ссылку для Копирования', - hide_all_windows: "Скрыть Все Окна", + get_copy_link: 'Получить ссылку для копирования', + hide_all_windows: "Скрыть все окна", + home: 'Домой', html_document: 'HTML документ', + hue: 'Оттенок', image: 'Изображение', incorrect_password: "Неверный пароль", - invite_link: "Пригласительная ссылка", + invite_link: "Ссылка для приглашения", item: 'элемент', - items_in_trash_cannot_be_renamed: `Этот элемент нельзя переименовать, потому что он находится в Корзине. Чтобы переименовать этот элемент, сначала перетащите его из Корзины.`, + items_in_trash_cannot_be_renamed: `Этот элемент нельзя переименовать, потому что он находится в Корзине. Чтобы переименовать этот элемент, сначала перенесите его из Корзины.`, jpeg_image: 'JPEG изображение', keep_in_taskbar: 'Сохранить на Панели Задач', language: "Язык", @@ -124,9 +158,15 @@ const ru = { log_in: "Войти", log_into_another_account_anyway: 'Все-равно войти в другой аккаунт', log_out: 'Выйти', + looks_good: "Выглядит здорово!", manage_sessions: "Управление Сеансами", + menubar_style: "Стиль меню", + menubar_style_desktop: "Рабочий стол", + menubar_style_system: "Система", + menubar_style_window: "Окно", + modified: 'Изменено', move: 'Переместить', - moving_file: "Перемещается %%", + moving_file: "Перемещаю %%", my_websites: "Мои Сайты", name: 'Имя', name_cannot_be_empty: 'Имя не может быть пустым.', @@ -136,39 +176,44 @@ const ru = { name_must_be_string: "Имя может содержать только текстовые символы.", name_too_long: `Имя не может быть длинее %% символов.`, new: 'Новый', - new_email: 'Новый Email', + new_email: 'Новая электронная почта', new_folder: 'Новая папка', - new_password: "Новый Пароль", - new_username: "Новое Имя Пользователя", + new_password: "Новый пароль", + new_username: "Новое имя пользователя", no: 'Нет', no_dir_associated_with_site: 'Нет директории, связанной с этим адресом.', no_websites_published: "Вы еще не опубликовали ни одного сайта.", ok: 'OK', open: "Открыть", - open_in_new_tab: "Открыть в Новой Вкладке", - open_in_new_window: "Открыть в Новом Окне", + open_in_new_tab: "Открыть в новой вкладке", + open_in_new_window: "Открыть в новом окне", open_with: "Открыть с помощью", + original_name: 'Оригинальное имя', + original_path: 'Изначальный путь', oss_code_and_content: "Программное обеспечение и контент с открытым исходным кодом", password: "Пароль", password_changed: "Пароль изменен.", - password_recovery_rate_limit: "Вы достигли лимита; пожалуйста, подождите несколько минут. Чтобы предотвратить это в будущем, не перезагружайте страницу слишком много раз.", + password_recovery_rate_limit: "Вы достигли лимита. Пожалуйста, подождите несколько минут. Чтобы предотвратить это в будущем, не перезагружайте страницу слишком много раз.", password_recovery_token_invalid: "Этот токен восстановления пароля больше не действителен.", password_recovery_unknown_error: "Произошла неизвестная ошибка. Пожалуйста, повторите попытку позже.", - password_required: 'Необходим Пароль.', - password_strength_error: "Пароль должен иметь длину не менее 8 символов и содержать хотя бы одну заглавную букву, одну строчную букву, одну цифру и один специальный символ.", - passwords_do_not_match: 'Поля `Новый Пароль` и `Подтвердите Новый Пароль` не совпадают.', + password_required: 'Необходимо ввести пароль.', + password_strength_error: "Пароль должен иметь длину не менее 8 символов и содержать хотя бы одну заглавную букву, одну строчную букву, одну цифру и один специальный знак.", + passwords_do_not_match: 'Поля `Новый пароль` и `Подтвердите новый пароль` не совпадают.', paste: 'Вставить', - paste_into_folder: "Вставить в Папку", + paste_into_folder: "Вставить в папку", + path: 'Путь', personalization: "Персонализация", pick_name_for_website: "Выберите имя для вашего сайта:", picture: "Изображение", - plural_suffix: 's', + pictures: 'Изображения', + plural_suffix: 's', //does not exist in Russian language powered_by_puter_js: `Создано на {{link=docs}}Puter.js{{/link}}`, preparing: "Подготовка...", preparing_for_upload: "Подготовка к загрузке...", + print: 'Печать', privacy: "Конфиденциальность", proceed_to_login: 'Перейти ко входу', - proceed_with_account_deletion: "Продолжить Удаление Учетной Записи", + proceed_with_account_deletion: "Продолжить удаление учетной записи", process_status_initializing: "Инициализация", process_status_running: "Выполняется", process_type_app: 'Прил', @@ -176,23 +221,27 @@ const ru = { process_type_ui: 'UI', properties: "Свойства", publish: "Опубликовать", + public: 'Общий доступ', publish_as_website: 'Опубликовать как сайт', puter_description: `Puter — это персональное облако, обеспечивающее конфиденциальность, позволяющее хранить все ваши файлы, приложения и игры в одном безопасном месте, доступном из любого места в любое время.`, - recent: "Недавний", + reading_file: "Чтение %strong%", + recent: "Недавнее", + recommended: "Рекоммендации", recover_password: "Восстановить Пароль", refer_friends_c2a: "Получите 1 ГБ за каждого друга, который создаст и подтвердит учетную запись на Puter. Ваш друг тоже получит 1 ГБ!", refer_friends_social_media_c2a: `Получите 1 ГБ бесплатного хранилища на Puter.com!`, refresh: 'Обновить', release_address_confirmation: `Вы уверены, что хотите освободить этот адрес?`, - remove_from_taskbar:'Удалить с Панели Задач', + remove_from_taskbar:'Удалить из панели задач', rename: 'Переименовать', repeat: 'Повторить', replace: 'Заменить', - replace_all: 'Заменить Все', - resend_confirmation_code: "Повторно отправить Код Подтверждения", - reset_colors: "Сбросить Цвета", + replace_all: 'Заменить все', + resend_confirmation_code: "Повторно отправить код подтверждения", + reset_colors: "Сбросить цвета", restart_puter_confirm: "Вы уверены, что хотите перезапустить Puter?", restore: "Восстановить", + save: 'Сохранить', saturation: 'Насыщенность', save_account: 'Сохранить учетную запись', save_account_to_get_copy_link: "Пожалуйста, создайте учетную запись, чтобы продолжить.", @@ -200,8 +249,11 @@ const ru = { save_session: 'Сохранить сеанс', save_session_c2a: 'Создайте учетную запись, чтобы сохранить текущий сеанс и не потерять данные.', scan_qr_c2a: 'Отсканируйте код ниже, чтобы войти в этот сеанс с других устройств', + scan_qr_2fa: 'Отсканируйте QR-код с помощью приложения аутентификации', scan_qr_generic: 'Отсканируйте этот QR-код с помощью телефона или другого устройства', + search: 'Поиск', seconds: 'секунды', + security: "Безопасность", select: "Выбрать", selected: 'выбрано', select_color: 'Выбрать цвет…', @@ -210,8 +262,11 @@ const ru = { send_password_recovery_email: "Отправить электронное письмо для восстановления пароля", session_saved: "Благодарим вас за создание учетной записи. Этот сеанс сохранен.", settings: "Настройки", - set_new_password: "Установить Новый Пароль", - share_to: "Поделиться с", + set_new_password: "Установить новый пароль", + share: "Поделиться", + share_to: "Поделиться", + share_with: "Поделиться с: ", + shortcut_to: "Ярлык для", show_all_windows: "Показать Все Окна", show_hidden: 'Показать скрытые', sign_in_with_puter: "Войти с Puter", @@ -219,13 +274,14 @@ const ru = { signing_in: "Вход в систему…", size: 'Размер', skip: 'Пропустить', + something_went_wrong: "Что-то пошло не так.", sort_by: 'Отсортировать по', start: 'Начать', status: "Статус", storage_usage: "Использование хранилища", storage_puter_used: 'использовано Puter', - taking_longer_than_usual: 'Это занимает немного больше времени, чем обычно. пожалуйста, подождите...', - task_manager: "Диспетчер Задач", + taking_longer_than_usual: 'Это занимает немного больше времени чем обычно, пожалуйста, подождите...', + task_manager: "Диспетчер задач", taskmgr_header_name: "Имя", taskmgr_header_status: "Статус", taskmgr_header_type: "Тип", @@ -234,9 +290,12 @@ const ru = { tos_fineprint: `Нажимая 'Создать бесплатную учетную запись', вы соглашаетесь с {{link=terms}}Условиями Использования{{/link}} и {{link=privacy}}Политикой Конфиденциальности{{/link}} Puter.`, transparency: "Прозрачность", trash: 'Корзина', + two_factor: 'Двухфакторная аутентификация', + two_factor_disabled: 'Двухфакторная аутентификация отключена', + two_factor_enabled: 'Двухфакторная аутентификация включена', type: 'Тип', type_confirm_to_delete_account: "Введите 'подтвердить', чтобы удалить учетную запись.", - ui_colors: "Цвета UI", + ui_colors: "Цвета пользовательского интерфейса", ui_manage_sessions: "Менеджер Сеансов", ui_revoke: "Отозвать", undo: 'Отменить', @@ -245,15 +304,46 @@ const ru = { upload: 'Загрузить', upload_here: 'Загрузить здесь', usage: 'Использование', - username: "Имя Пользователя", - username_changed: 'Имя Пользователя успешно обновлено.', + username: "Имя пользователя", + username_changed: 'Имя пользователя успешно обновлено.', username_required: 'Требуется имя Пользователя.', versions: "Версии", + videos: 'Видео', visibility: 'Видимость', yes: 'Да', yes_release_it: 'Да, освободить.', you_have_been_referred_to_puter_by_a_friend: "Вы были приглашены в Puter другом!", - zip: "Заархивировать", + zip: "Добавить в архив", + zipping_file: "Добавление в архив %strong%", + + // === 2FA Setup === + setup2fa_1_step_heading: 'Откройте приложение для аутенцификации', + setup2fa_1_instructions: ` + Вы можете использовать любое приложение для аутентификации, поддерживающее протокол одноразового пароля на основе времени (TOTP). + Существует большой выбор приложений, но если вы не уверены, то + Authy + это хороший выбор для Android и iOS + `, + setup2fa_2_step_heading: 'Отсканируйте QR-код', + setup2fa_3_step_heading: 'Введите 6-значный код', + setup2fa_4_step_heading: 'Скопируйте коды восстановления', + setup2fa_4_instructions: ` + Эти коды восстановления — единственный способ получить доступ к вашей учетной записи, если вы потеряете свой телефон или не сможете использовать приложение для аутентификации. + Обязательно храните их в безопасном месте. + `, + setup2fa_5_step_heading: 'Подтвердите установку двухфакторной аутентификации', + setup2fa_5_confirmation_1: 'Я созранил коды восстановления в безопасном месте', + setup2fa_5_confirmation_2: 'Я готов включить двухфакторную аутентификацию', + setup2fa_5_button: 'Включить двухфакторную аутентификацию', + + // === 2FA Login === + login2fa_otp_title: 'Введите код двухфакторной аутентификации', + login2fa_otp_instructions: 'Введите 6-значный код из приложения для аутентификации', + login2fa_recovery_title: 'Введите код восстановления доступа', + login2fa_recovery_instructions: 'Введите один из кодов восстановления доступа чтобы получить доступ к учетной записи.', + login2fa_use_recovery_code: 'Используйте код восстановления доступа', + login2fa_recovery_back: 'Назад', + login2fa_recovery_placeholder: 'XXXXXXXX', } }; From 3ed7916856f03eafbe0891f2ab39c34d20d2bd24 Mon Sep 17 00:00:00 2001 From: KernelDeimos Date: Mon, 8 Jul 2024 15:24:26 -0400 Subject: [PATCH 4/4] feat: JSON support for kv driver --- src/backend/src/drivers/DBKVStore.js | 18 ++++++++--- .../database/SqliteDatabaseAccessService.js | 7 ++++- .../database/sqlite_setup/0023_fix-kv.sql | 31 +++++++++++++++++++ 3 files changed, 51 insertions(+), 5 deletions(-) create mode 100644 src/backend/src/services/database/sqlite_setup/0023_fix-kv.sql diff --git a/src/backend/src/drivers/DBKVStore.js b/src/backend/src/drivers/DBKVStore.js index 2131e46a8..a4e2f05cc 100644 --- a/src/backend/src/drivers/DBKVStore.js +++ b/src/backend/src/drivers/DBKVStore.js @@ -58,6 +58,11 @@ class DBKVStore extends Driver { `SELECT * FROM kv WHERE user_id=? AND (app IS NULL OR app = 'global') AND kkey_hash=? LIMIT 1`, [ user.id, key_hash ] ); + + if ( kv[0] ) kv[0].value = db.case({ + mysql: () => kv[0].value, + otherwise: () => JSON.parse(kv[0].value ?? 'null'), + })(); return kv[0]?.value ?? null; }, @@ -74,10 +79,11 @@ class DBKVStore extends Driver { } // Validate the value - value = value === undefined ? null : String(value); + value = value === undefined ? null : value; if ( value !== null && - Buffer.byteLength(value, 'utf8') > config.kv_max_value_size + Buffer.byteLength(JSON.stringify(value), 'utf8') > + config.kv_max_value_size ) { throw new Error(`value is too large. Max size is ${config.kv_max_value_size}.`); } @@ -102,7 +108,8 @@ class DBKVStore extends Driver { sqlite: 'ON CONFLICT(user_id, app, kkey_hash) DO UPDATE SET value = excluded.value', }), [ - user.id, app?.uid ?? 'global', key_hash, key, value, + user.id, app?.uid ?? 'global', key_hash, key, + JSON.stringify(value), ...db.case({ mysql: [value], otherwise: [] }), ] ); @@ -164,7 +171,10 @@ class DBKVStore extends Driver { rows = rows.map(row => ({ key: row.kkey, - value: row.value, + value: db.case({ + mysql: () => row.value, + otherwise: () => JSON.parse(row.value ?? 'null') + })(), })); as = as || 'entries'; diff --git a/src/backend/src/services/database/SqliteDatabaseAccessService.js b/src/backend/src/services/database/SqliteDatabaseAccessService.js index 7472d1570..4d987c406 100644 --- a/src/backend/src/services/database/SqliteDatabaseAccessService.js +++ b/src/backend/src/services/database/SqliteDatabaseAccessService.js @@ -42,7 +42,7 @@ class SqliteDatabaseAccessService extends BaseDatabaseAccessService { this.db = new Database(this.config.path); // Database upgrade logic - const TARGET_VERSION = 20; + const TARGET_VERSION = 21; if ( do_setup ) { this.log.noticeme(`SETUP: creating database at ${this.config.path}`); @@ -69,6 +69,7 @@ class SqliteDatabaseAccessService extends BaseDatabaseAccessService { '0020_dev-center.sql', '0021_app-owner-id.sql', '0022_dev-center-max.sql', + '0023_fix-kv.sql', ].map(p => path_.join(__dirname, 'sqlite_setup', p)); const fs = require('fs'); for ( const filename of sql_files ) { @@ -165,6 +166,10 @@ class SqliteDatabaseAccessService extends BaseDatabaseAccessService { upgrade_files.push('0022_dev-center-max.sql'); } + if ( user_version <= 20 ) { + upgrade_files.push('0023_fix-kv.sql'); + } + if ( upgrade_files.length > 0 ) { this.log.noticeme(`Database out of date: ${this.config.path}`); this.log.noticeme(`UPGRADING DATABASE: ${user_version} -> ${TARGET_VERSION}`); diff --git a/src/backend/src/services/database/sqlite_setup/0023_fix-kv.sql b/src/backend/src/services/database/sqlite_setup/0023_fix-kv.sql new file mode 100644 index 000000000..9d76e6d0d --- /dev/null +++ b/src/backend/src/services/database/sqlite_setup/0023_fix-kv.sql @@ -0,0 +1,31 @@ +CREATE TABLE `new_kv` ( + `id` INTEGER PRIMARY KEY, + `app` char(40) DEFAULT NULL, + `user_id` int(10) NOT NULL, + `kkey_hash` bigint(20) NOT NULL, + `kkey` text NOT NULL, + `value` JSON, + `migrated` tinyint(1) DEFAULT '0', + UNIQUE (user_id, app, kkey_hash) +); + +INSERT INTO `new_kv` +( + `app`, + `user_id`, + `kkey_hash`, + `kkey`, + `value` +) +SELECT + `app`, + `user_id`, + `kkey_hash`, + `kkey`, + json_quote(value) +FROM `kv`; + +DROP TABLE `kv`; + +ALTER TABLE `new_kv` +RENAME TO `kv`;