From 873f849318d1f99c31c98c07cc1ac696a58aa0f0 Mon Sep 17 00:00:00 2001 From: Dwynr Date: Thu, 15 Aug 2024 00:51:18 +0200 Subject: [PATCH] fix: write atomically --- package-lock.json | 51 ++++++++++++++++++++++++++++++++++++++++------- package.json | 4 +++- src/certs.ts | 7 ++++--- 3 files changed, 51 insertions(+), 11 deletions(-) diff --git a/package-lock.json b/package-lock.json index 8ab19c0..147d884 100644 --- a/package-lock.json +++ b/package-lock.json @@ -19,6 +19,7 @@ "node-cache": "^5.1.2", "selfsigned": "^2.4.1", "uuid": "^10.0.0", + "write-file-atomic": "^5.0.1", "xml-js-builder": "^1.0.3", "xml2js": "^0.6.2" }, @@ -29,6 +30,7 @@ "@types/lodash": "^4.14.202", "@types/mime-types": "^2.1.4", "@types/uuid": "^10.0.0", + "@types/write-file-atomic": "^4.0.3", "@types/xml2js": "^0.4.14", "@typescript-eslint/eslint-plugin": "^6.20.0", "@typescript-eslint/parser": "^6.20.0", @@ -1881,6 +1883,20 @@ "node": ">=8" } }, + "node_modules/@jest/transform/node_modules/write-file-atomic": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz", + "integrity": "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==", + "dev": true, + "license": "ISC", + "dependencies": { + "imurmurhash": "^0.1.4", + "signal-exit": "^3.0.7" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, "node_modules/@jest/types": { "version": "29.6.3", "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", @@ -2342,6 +2358,16 @@ "integrity": "sha512-7gqG38EyHgyP1S+7+xomFtL+ZNHcKv6DwNaCZmJmo1vgMugyF3TCnXVg4t1uk89mLNwnLtnY3TpOpCOyp1/xHQ==", "dev": true }, + "node_modules/@types/write-file-atomic": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@types/write-file-atomic/-/write-file-atomic-4.0.3.tgz", + "integrity": "sha512-qdo+vZRchyJIHNeuI1nrpsLw+hnkgqP/8mlaN6Wle/NKhydHmUN9l4p3ZE8yP90AJNJW4uB8HQhedb4f1vNayQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, "node_modules/@types/xml2js": { "version": "0.4.14", "resolved": "https://registry.npmjs.org/@types/xml2js/-/xml2js-0.4.14.tgz", @@ -5102,7 +5128,6 @@ "version": "0.1.4", "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", - "dev": true, "engines": { "node": ">=0.8.19" } @@ -8917,16 +8942,28 @@ "dev": true }, "node_modules/write-file-atomic": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz", - "integrity": "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==", - "dev": true, + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-5.0.1.tgz", + "integrity": "sha512-+QU2zd6OTD8XWIJCbffaiQeH9U73qIqafo1x6V1snCWYGJf6cVE0cDR4D8xRzcEnfI21IFrUPzPGtcPf8AC+Rw==", + "license": "ISC", "dependencies": { "imurmurhash": "^0.1.4", - "signal-exit": "^3.0.7" + "signal-exit": "^4.0.1" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/write-file-atomic/node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "license": "ISC", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, "node_modules/ws": { diff --git a/package.json b/package.json index e323e3b..44f98fd 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@filen/webdav", - "version": "0.2.27", + "version": "0.2.28", "description": "Filen WebDAV", "main": "dist/index.js", "types": "dist/index.d.ts", @@ -39,6 +39,7 @@ "@types/lodash": "^4.14.202", "@types/mime-types": "^2.1.4", "@types/uuid": "^10.0.0", + "@types/write-file-atomic": "^4.0.3", "@types/xml2js": "^0.4.14", "@typescript-eslint/eslint-plugin": "^6.20.0", "@typescript-eslint/parser": "^6.20.0", @@ -61,6 +62,7 @@ "node-cache": "^5.1.2", "selfsigned": "^2.4.1", "uuid": "^10.0.0", + "write-file-atomic": "^5.0.1", "xml-js-builder": "^1.0.3", "xml2js": "^0.6.2" } diff --git a/src/certs.ts b/src/certs.ts index bd44189..471f7d9 100644 --- a/src/certs.ts +++ b/src/certs.ts @@ -2,6 +2,7 @@ import selfsigned from "selfsigned" import fs from "fs-extra" import pathModule from "path" import { platformConfigPath } from "./utils" +import writeFileAtomic from "write-file-atomic" /** * Certs @@ -60,9 +61,9 @@ export class Certs { ) await Promise.all([ - fs.writeFile(this.certPath, generated.cert), - fs.writeFile(this.privateKeyPath, generated.private), - fs.writeFile(this.expiryPath, (now + 86400 * 360).toString()) + writeFileAtomic(this.certPath, generated.cert, "utf-8"), + writeFileAtomic(this.privateKeyPath, generated.private, "utf-8"), + writeFileAtomic(this.expiryPath, (now + 86400 * 360).toString(), "utf-8") ]) return {