Compare commits

...
5 Commits
Author SHA1 Message Date
fyears ea12a14d7f 0.0.12 2021-11-08 10:00:40 +08:00
fyears 3609a78465 test enc 2021-11-08 10:00:06 +08:00
fyears 7ec2db4006 correctly fetch remote data 2021-11-08 09:38:39 +08:00
fyears 5352c7b828 check undefined 2021-11-08 09:37:51 +08:00
fyears 2a49bb53b2 more attention 2021-11-08 00:57:18 +08:00
6 changed files with 28 additions and 8 deletions
+1 -1
View File
@@ -1,7 +1,7 @@
{ {
"id": "obsdian-save-remote", "id": "obsdian-save-remote",
"name": "Save remote", "name": "Save remote",
"version": "0.0.11", "version": "0.0.12",
"minAppVersion": "0.12.15", "minAppVersion": "0.12.15",
"description": "This is yet another plugin allowing users to sync notes between local device and the cloud.", "description": "This is yet another plugin allowing users to sync notes between local device and the cloud.",
"author": "fyears", "author": "fyears",
+3 -1
View File
@@ -1,6 +1,6 @@
{ {
"name": "obsidian-save-remote", "name": "obsidian-save-remote",
"version": "0.0.11", "version": "0.0.12",
"description": "This is yet another sync plugin for Obsidian app.", "description": "This is yet another sync plugin for Obsidian app.",
"scripts": { "scripts": {
"dev": "webpack --mode development --watch", "dev": "webpack --mode development --watch",
@@ -15,10 +15,12 @@
"license": "Apache-2.0", "license": "Apache-2.0",
"devDependencies": { "devDependencies": {
"@types/chai": "^4.2.22", "@types/chai": "^4.2.22",
"@types/chai-as-promised": "^7.1.4",
"@types/mime-types": "^2.1.1", "@types/mime-types": "^2.1.1",
"@types/mocha": "^9.0.0", "@types/mocha": "^9.0.0",
"@types/node": "^14.14.37", "@types/node": "^14.14.37",
"chai": "^4.3.4", "chai": "^4.3.4",
"chai-as-promised": "^7.1.1",
"cross-env": "^7.0.3", "cross-env": "^7.0.3",
"mocha": "^9.1.3", "mocha": "^9.1.3",
"prettier": "^2.4.1", "prettier": "^2.4.1",
+6 -3
View File
@@ -205,13 +205,16 @@ export class PasswordModal extends Modal {
contentEl.createEl("p", { text: "Empty means no password." }); contentEl.createEl("p", { text: "Empty means no password." });
contentEl.createEl("p", { contentEl.createEl("p", {
text: "Attention 1/3: The password setting itself is stored in PLAIN TEXT LOCALLY (because the plugin needs to use the password to encrypt the files) (and the password would not be sent to remote by this plugin).", text: "Attention 1/4: The password setting itself is stored in PLAIN TEXT LOCALLY (because the plugin needs to use the password to encrypt the files) (and the password would not be sent to remote by this plugin).",
}); });
contentEl.createEl("p", { contentEl.createEl("p", {
text: "Attention 2/3: If you change the password. You should make sure the remote service (s3/webdav/...) IS EMPTY, or REMOTE FILES WERE ENCRYPTED BY THAT NEW PASSWORD. OTHERWISE SOMETHING BAD WOULD HAPPEN!", text: "Attention 2/4: The file contents are encrypted using openssl format. BUT, some metadata such as file sizes and directory structures are not encrypted or can be easily guessed.",
}); });
contentEl.createEl("p", { contentEl.createEl("p", {
text: "Attention 3/3: The longer the password, the better.", text: "Attention 3/4: If you change the password. You should make sure the remote service (s3/webdav/...) IS EMPTY, or REMOTE FILES WERE ENCRYPTED BY THAT NEW PASSWORD. OTHERWISE SOMETHING BAD WOULD HAPPEN!",
});
contentEl.createEl("p", {
text: "Attention 4/4: The longer the password, the better.",
}); });
new Setting(contentEl) new Setting(contentEl)
+4 -1
View File
@@ -98,7 +98,7 @@ export const uploadToRemote = async (
ContentType: contentType, ContentType: contentType,
}) })
); );
return await getRemoteMeta(s3Client, s3Config, fileOrFolderPath); return await getRemoteMeta(s3Client, s3Config, uploadFile);
} else { } else {
// file // file
// we ignore isRecursively parameter here // we ignore isRecursively parameter here
@@ -149,6 +149,9 @@ export const listFromRemote = async (
if (rsp.$metadata.httpStatusCode !== 200) { if (rsp.$metadata.httpStatusCode !== 200) {
throw Error("some thing bad while listing remote!"); throw Error("some thing bad while listing remote!");
} }
if (rsp.Contents === undefined) {
break;
}
contents.push(...rsp.Contents); contents.push(...rsp.Contents);
isTruncated = rsp.IsTruncated; isTruncated = rsp.IsTruncated;
+13 -1
View File
@@ -1,6 +1,7 @@
import * as fs from "fs"; import * as fs from "fs";
import * as path from "path"; import * as path from "path";
import { expect } from "chai"; import * as chai from "chai";
import chaiAsPromised from "chai-as-promised";
import { base64ToBase32, bufferToArrayBuffer } from "../src/misc"; import { base64ToBase32, bufferToArrayBuffer } from "../src/misc";
import { import {
decryptArrayBuffer, decryptArrayBuffer,
@@ -9,6 +10,9 @@ import {
encryptStringToBase32, encryptStringToBase32,
} from "../src/encrypt"; } from "../src/encrypt";
chai.use(chaiAsPromised);
const expect = chai.expect;
describe("Encryption tests", () => { describe("Encryption tests", () => {
beforeEach(function () { beforeEach(function () {
global.window = { global.window = {
@@ -22,6 +26,14 @@ describe("Encryption tests", () => {
expect(await encryptStringToBase32(k, password)).to.not.equal(k); expect(await encryptStringToBase32(k, password)).to.not.equal(k);
}); });
it("should raise error using different password", async () => {
const k = "secret text";
const password = "hey";
const password2 = "hey2";
const enc = await encryptStringToBase32(k, password);
await expect(decryptBase32ToString(enc, password2)).to.be.rejected;
});
it("should encrypt and decrypt string and get the same result returned", async () => { it("should encrypt and decrypt string and get the same result returned", async () => {
const k = "jfkkjkjbce7983ycdeknkkjckooAIUHIDIBIE((*BII)njD/d/dd/d/sjxhux"; const k = "jfkkjkjbce7983ycdeknkkjckooAIUHIDIBIE((*BII)njD/d/dd/d/sjxhux";
const password = "hfiuibec989###oiu982bj1`"; const password = "hfiuibec989###oiu982bj1`";
+1 -1
View File
@@ -1,3 +1,3 @@
{ {
"0.0.11": "0.12.15" "0.0.12": "0.12.15"
} }