Encrypt image bytes in the browser, keep keys out of POST bodies (URL fragment or path secret), and POST ciphertext via typed upload API helpers.
35 lines
1.3 KiB
TypeScript
35 lines
1.3 KiB
TypeScript
import { defineStore } from 'pinia';
|
|
import { ALTCHA_REQUEST_HEADER } from '@/consts/altchaRequestHeader';
|
|
import { api } from '@/plugins/axios';
|
|
import type { CreateHotlinkUploadRequest } from '@/types/upload/CreateHotlinkUploadRequest';
|
|
import type { CreateZkUploadRequest } from '@/types/upload/CreateZkUploadRequest';
|
|
import type { CreatedUploadResult } from '@/types/upload/CreatedUploadResult';
|
|
|
|
export const useUploadStore = defineStore('upload', () => {
|
|
const createZkUpload = async (body: CreateZkUploadRequest, altcha?: string): Promise<CreatedUploadResult> => {
|
|
const { data } = await api.post<CreatedUploadResult>('/uploads/zk', body, {
|
|
headers: getUploadRequestHeaders(altcha)
|
|
});
|
|
|
|
return data;
|
|
};
|
|
|
|
const createHotlinkUpload = async (
|
|
body: CreateHotlinkUploadRequest,
|
|
altcha?: string
|
|
): Promise<CreatedUploadResult> => {
|
|
const { data } = await api.post<CreatedUploadResult>('/uploads/hotlink', body, {
|
|
headers: getUploadRequestHeaders(altcha)
|
|
});
|
|
|
|
return data;
|
|
};
|
|
|
|
const getUploadRequestHeaders = (altcha?: string) => (altcha ? { [ALTCHA_REQUEST_HEADER]: altcha } : undefined);
|
|
|
|
return {
|
|
createZkUpload,
|
|
createHotlinkUpload
|
|
};
|
|
});
|