Sanitize file names taken from server metadata (closes #9)
check / check (push) Successful in 37s
check / check (push) Successful in 37s
A file title or album name decrypted from server data could name a path outside the chosen directory (`../../.ssh/authorized_keys`). One module, src/filename.ts, now makes such names safe for `quak get`/`get-thumb` without `--out`, downloadFile/downloadThumbnail without outPath, and the backup and metadata backup trees. Originals-cache extensions are limited to letters and digits. A user-supplied path is still used as is. decryptFile reads a missing or non-string title as "" and rejects metadata that is not a JSON object. Model: opus-5-5
This commit was merged in pull request #78.
This commit is contained in:
@@ -64,6 +64,24 @@ describe("CLI file output (issue #52)", () => {
|
||||
expect(thumbnailName(renamedFile)).toBe(`thumb_${RAW_TITLE}`);
|
||||
});
|
||||
|
||||
it("sanitizes the title when naming `quak get` downloads", () => {
|
||||
// Without `--out`, the server-supplied title names the file, so it must
|
||||
// not be able to point outside the working directory.
|
||||
const hostile = {
|
||||
...renamedFile,
|
||||
metadata: { ...renamedFile.metadata, title: "../../.bashrc" },
|
||||
};
|
||||
expect(originalName(hostile)).toBe("__.._.bashrc");
|
||||
expect(thumbnailName(hostile)).toBe("thumb___.._.bashrc");
|
||||
|
||||
const untitled = {
|
||||
...renamedFile,
|
||||
metadata: { ...renamedFile.metadata, title: "" },
|
||||
};
|
||||
expect(originalName(untitled)).toBe("file-100");
|
||||
expect(thumbnailName(untitled)).toBe("thumb_file-100");
|
||||
});
|
||||
|
||||
it("does not use the editedName/editedTime projection", () => {
|
||||
const record = deriveRecords([], [renamedFile]).photos.get(100);
|
||||
// The projection prefers the edits and reports milliseconds; the CLI
|
||||
|
||||
Reference in New Issue
Block a user