Skip to content

Commit 210eefc

Browse files
for privacy concious ppl you can select to not use the canvas api when uploading media and use the piexif library to strip metadata. This means no extra compression though
1 parent 3075001 commit 210eefc

3 files changed

Lines changed: 48 additions & 3 deletions

File tree

src/app/user/account_settings/page.js

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@ export default function Home() {
4848
const [customCss, setCustomCss] = useState("");
4949
const [generalNotifType, setGeneralNotifType] = useState("none");
5050
const [newPostNotifType, setNewPostNotifType] = useState("none");
51+
const [uploadImagesUsingCanvas, setUploadImagesUsingCanvas] = useState(true);
5152

5253
const [qrSvg, setQrSvg] = useState({html: "", size: "0px"});
5354

@@ -86,7 +87,7 @@ export default function Home() {
8687
setEnabledCustomPostAnimations(LocalSettings.enabledCustomPostAnimations);
8788
setGeneralNotifType(LocalSettings.generalNotificationType);
8889
setNewPostNotifType(LocalSettings.newPostNotificationType);
89-
90+
setUploadImagesUsingCanvas(LocalSettings.uploadImagesUsingCanvas);
9091
});
9192

9293
return <UnifiedMenu
@@ -158,6 +159,13 @@ export default function Home() {
158159
setExtendPostHitbox(yes);
159160
}}/><br/>
160161

162+
Upload Images using Canvas API: &nbsp;
163+
<input type="checkbox" checked={uploadImagesUsingCanvas} onChange={async (e) => {
164+
const yes = e.target.checked;
165+
await saveLocalSettingsKey("uploadImagesUsingCanvas", yes);
166+
setUploadImagesUsingCanvas(yes);
167+
}}/><br/>
168+
161169
{GlobalStuff.loggedIn ?
162170
<>
163171
<br/>

src/lib/localSettings.js

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ export let LocalSettings = {
1616
overrideShowGlobalFeed: false,
1717
generalNotificationType: "none",
1818
newPostNotificationType: "none",
19+
uploadImagesUsingCanvas: true,
1920
};
2021

2122
async function customCssReady() {
@@ -101,6 +102,7 @@ export async function loadLocalSettings() {
101102
LocalSettings.overrideShowGlobalFeed = await loadKeyOrDefault("overrideShowGlobalFeed", false);
102103
LocalSettings.generalNotificationType = await loadKeyOrDefault("generalNotificationType", "none");
103104
LocalSettings.newPostNotificationType = await loadKeyOrDefault("newPostNotificationType", "none");
105+
LocalSettings.uploadImagesUsingCanvas = await loadKeyOrDefault("uploadImagesUsingCanvas", true);
104106

105107
console.info("> Loaded Local Settings");
106108
}
@@ -117,6 +119,7 @@ export async function saveLocalSettings() {
117119
await saveKey("overrideShowGlobalFeed", LocalSettings.overrideShowGlobalFeed);
118120
await saveKey("generalNotificationType", LocalSettings.generalNotificationType);
119121
await saveKey("newPostNotificationType", LocalSettings.newPostNotificationType);
122+
await saveKey("uploadImagesUsingCanvas", LocalSettings.uploadImagesUsingCanvas);
120123

121124
await updateCustomCss();
122125

src/lib/publicInfo/publicInfoUtils.js

Lines changed: 36 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@ import {CoolCache} from "@/lib/coolCache";
77
import {uploadData} from "@/lib/fileUtils";
88
import {doesImageExist} from "@/lib/markedExtension";
99
import {SpinActivity} from "@/lib/spinner";
10+
import {LocalSettings} from "@/lib/localSettings";
11+
import piexif from "@/lib/piexif/piexif";
1012

1113
function dataURLtoFile(dataurl, filename) {
1214
var arr = dataurl.split(","),
@@ -21,7 +23,7 @@ function dataURLtoFile(dataurl, filename) {
2123
}
2224

2325

24-
async function stripExifDataAndRotateCorrectly(ogDataUrlImage) {
26+
async function stripExifRotateAndCompressCanvas(ogDataUrlImage) {
2527
return await new Promise((res, rej) => {
2628
const image = new Image();
2729
image.onload = () => {
@@ -59,6 +61,35 @@ async function stripExifDataAndRotateCorrectly(ogDataUrlImage) {
5961
}
6062

6163

64+
async function stripExifRotateNoCanvas(ogDataUrlImage) {
65+
const exif = piexif.load(ogDataUrlImage);
66+
console.log(exif);
67+
68+
let orientation = exif["0th"]["274"]; // piexif.ImageIFDName.Orientation
69+
console.log("Orientation: ", orientation);
70+
71+
// remove EXIF data
72+
const newData = piexif.remove(ogDataUrlImage);
73+
74+
// Add Rotation data
75+
const newData2 = piexif.insert(
76+
piexif.dump({
77+
"0th": {
78+
"274": orientation,
79+
}
80+
}),
81+
newData
82+
);
83+
84+
// Check EXIF data
85+
const exif2 = piexif.load(newData2);
86+
console.log(exif2);
87+
88+
// console.log("Size 1: ", e.target.result.length);
89+
// console.log("Size 2: ", resData.length);
90+
return newData2;
91+
}
92+
6293
export async function uploadMediaToServer(files) {
6394
try {
6495
if (files == undefined)
@@ -78,7 +109,10 @@ export async function uploadMediaToServer(files) {
78109
reader.onload = async (e) => {
79110
// read EXIF data and dump
80111
try {
81-
const resData = await stripExifDataAndRotateCorrectly(e.target.result); // we get a DATA URL
112+
const resData =
113+
LocalSettings.uploadImagesUsingCanvas ?
114+
(await stripExifRotateAndCompressCanvas(e.target.result)) :
115+
(await stripExifRotateNoCanvas(e.target.result)); // we get a DATA URL
82116

83117
// // Check EXIF data
84118
// const exif2 = piexif.load(resData);

0 commit comments

Comments
 (0)