mirror of
https://github.com/remotely-save/remotely-save.git
synced 2024-06-07 21:10:45 +00:00
more tests
This commit is contained in:
parent
b26d6a7ffb
commit
ce4e55fcc7
@ -31,7 +31,8 @@
|
|||||||
"typescript": "^4.4.4",
|
"typescript": "^4.4.4",
|
||||||
"webdav-server": "^2.6.2",
|
"webdav-server": "^2.6.2",
|
||||||
"webpack": "^5.58.2",
|
"webpack": "^5.58.2",
|
||||||
"webpack-cli": "^4.9.1"
|
"webpack-cli": "^4.9.1",
|
||||||
|
"xregexp": "^5.1.0"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@aws-sdk/client-s3": "^3.37.0",
|
"@aws-sdk/client-s3": "^3.37.0",
|
||||||
|
19
src/misc.ts
19
src/misc.ts
@ -2,6 +2,7 @@ import { Vault } from "obsidian";
|
|||||||
import * as path from "path";
|
import * as path from "path";
|
||||||
|
|
||||||
import { base32 } from "rfc4648";
|
import { base32 } from "rfc4648";
|
||||||
|
import XRegExp from "XRegExp";
|
||||||
|
|
||||||
export type SUPPORTED_SERVICES_TYPE = "s3" | "webdav" | "ftp";
|
export type SUPPORTED_SERVICES_TYPE = "s3" | "webdav" | "ftp";
|
||||||
|
|
||||||
@ -111,3 +112,21 @@ export const hexStringToTypedArray = (hex: string) => {
|
|||||||
export const base64ToBase32 = (a: string) => {
|
export const base64ToBase32 = (a: string) => {
|
||||||
return base32.stringify(Buffer.from(a, "base64"));
|
return base32.stringify(Buffer.from(a, "base64"));
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* iOS Safari could decrypt string with invalid password!
|
||||||
|
* So we need an extra way to test the decrypted result.
|
||||||
|
* One simple way is testing the result are "valid", printable chars or not.
|
||||||
|
*
|
||||||
|
* https://stackoverflow.com/questions/6198986
|
||||||
|
* https://www.regular-expressions.info/unicode.html
|
||||||
|
* Manual test shows that emojis like '🍎' match '\\p{Cs}',
|
||||||
|
* so we need to write the regrex in a form that \p{C} minus \p{Cs}
|
||||||
|
* @param a
|
||||||
|
*/
|
||||||
|
export const isVaildText = (a: string) => {
|
||||||
|
// If the regex matches, the string is invalid.
|
||||||
|
return !XRegExp("\\p{Cc}|\\p{Cf}|\\p{Co}|\\p{Cn}|\\p{Zl}|\\p{Zp}", "A").test(
|
||||||
|
a
|
||||||
|
);
|
||||||
|
};
|
||||||
|
26
src/sync.ts
26
src/sync.ts
@ -16,7 +16,12 @@ import {
|
|||||||
deleteFromRemote,
|
deleteFromRemote,
|
||||||
downloadFromRemote,
|
downloadFromRemote,
|
||||||
} from "./s3";
|
} from "./s3";
|
||||||
import { mkdirpInVault, SUPPORTED_SERVICES_TYPE, isHiddenPath } from "./misc";
|
import {
|
||||||
|
mkdirpInVault,
|
||||||
|
SUPPORTED_SERVICES_TYPE,
|
||||||
|
isHiddenPath,
|
||||||
|
isVaildText,
|
||||||
|
} from "./misc";
|
||||||
import {
|
import {
|
||||||
decryptBase32ToString,
|
decryptBase32ToString,
|
||||||
encryptStringToBase32,
|
encryptStringToBase32,
|
||||||
@ -74,6 +79,7 @@ export interface PasswordCheckType {
|
|||||||
| "remote_encrypted_local_no_password"
|
| "remote_encrypted_local_no_password"
|
||||||
| "password_matched"
|
| "password_matched"
|
||||||
| "password_not_matched"
|
| "password_not_matched"
|
||||||
|
| "invalid_text_after_decryption"
|
||||||
| "remote_not_encrypted_local_has_password"
|
| "remote_not_encrypted_local_has_password"
|
||||||
| "no_password_both_sides";
|
| "no_password_both_sides";
|
||||||
}
|
}
|
||||||
@ -101,10 +107,20 @@ export const isPasswordOk = async (
|
|||||||
}
|
}
|
||||||
try {
|
try {
|
||||||
const res = await decryptBase32ToString(santyCheckKey, password);
|
const res = await decryptBase32ToString(santyCheckKey, password);
|
||||||
return {
|
|
||||||
ok: true,
|
// additional test
|
||||||
reason: "password_matched",
|
// because iOS Safari bypasses decryption with wrong password!
|
||||||
} as PasswordCheckType;
|
if (isVaildText(res)) {
|
||||||
|
return {
|
||||||
|
ok: true,
|
||||||
|
reason: "password_matched",
|
||||||
|
} as PasswordCheckType;
|
||||||
|
} else {
|
||||||
|
return {
|
||||||
|
ok: false,
|
||||||
|
reason: "invalid_text_after_decryption",
|
||||||
|
} as PasswordCheckType;
|
||||||
|
}
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
return {
|
return {
|
||||||
ok: false,
|
ok: false,
|
||||||
|
@ -70,3 +70,22 @@ describe("Misc: get folder levels", () => {
|
|||||||
expect(misc.getFolderLevels(item3)).to.deep.equal(res3);
|
expect(misc.getFolderLevels(item3)).to.deep.equal(res3);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
describe("Misc: vaild file name tests", () => {
|
||||||
|
it("should treat no ascii correctly", async () => {
|
||||||
|
const x = misc.isVaildText("😄🍎 apple 苹果");
|
||||||
|
// console.log(x)
|
||||||
|
expect(x).to.be.true;
|
||||||
|
});
|
||||||
|
|
||||||
|
it("should find not-printable chars correctly", async () => {
|
||||||
|
const x = misc.isVaildText("😄🍎 apple 苹果\u0000");
|
||||||
|
// console.log(x)
|
||||||
|
expect(x).to.be.false;
|
||||||
|
});
|
||||||
|
|
||||||
|
it("should allow spaces/slashes/...", async () => {
|
||||||
|
const x = misc.isVaildText("😄🍎 apple 苹果/-_=/\\*%^&@#$`");
|
||||||
|
expect(x).to.be.true;
|
||||||
|
});
|
||||||
|
});
|
||||||
|
Loading…
Reference in New Issue
Block a user