mirror of
https://github.com/mollersuite/monofile.git
synced 2024-11-25 15:06:26 -08:00
MAN FUCK YO PICKLES honk mimimimimimi honk mimimim
This commit is contained in:
parent
edc3e2c719
commit
7654801e41
|
@ -426,19 +426,22 @@ export default class Files {
|
||||||
useRanges
|
useRanges
|
||||||
? {
|
? {
|
||||||
Range: `bytes=${
|
Range: `bytes=${
|
||||||
position == 0 &&
|
// If this is the first chunk of the file (position == 0)
|
||||||
range &&
|
// and both 'range' and 'file.chunkSize' are defined,
|
||||||
file.chunkSize
|
// calculate the start of the range.
|
||||||
? range.start -
|
// Otherwise, default to "0".
|
||||||
scan_files_begin *
|
position == 0 && range
|
||||||
file.chunkSize
|
&& file.chunkSize
|
||||||
|
? range.start - scan_files_begin * file.chunkSize
|
||||||
: "0"
|
: "0"
|
||||||
}-${
|
}-${
|
||||||
position == attachments.length - 1 &&
|
// If this is the last chunk of the file (position == attachments.length - 1)
|
||||||
range &&
|
// and both 'range' and 'file.chunkSize' are defined,
|
||||||
file.chunkSize
|
// calculate the end of the range.
|
||||||
? range.end -
|
// Otherwise, default to an empty string.
|
||||||
scan_files_end * file.chunkSize
|
position == attachments.length - 1 && range
|
||||||
|
&& file.chunkSize
|
||||||
|
? range.end - scan_files_end * file.chunkSize
|
||||||
: ""
|
: ""
|
||||||
}`,
|
}`,
|
||||||
}
|
}
|
||||||
|
|
|
@ -28,210 +28,214 @@ let config = require(`${process.cwd()}/config.json`)
|
||||||
primaryApi.use(getAccount)
|
primaryApi.use(getAccount)
|
||||||
|
|
||||||
module.exports = function (files: Files) {
|
module.exports = function (files: Files) {
|
||||||
// primaryApi.get(
|
primaryApi.get(
|
||||||
|
["/file/:fileId", "/cpt/:fileId/*", "/:fileId"],
|
||||||
|
async (ctx) => {
|
||||||
|
const fileId = (ctx.req.param() as {fileId: string}).fileId
|
||||||
|
const reqRange
|
||||||
|
|
||||||
|
let acc = ctx.get("account") as Accounts.Account
|
||||||
|
|
||||||
|
let file = files.getFilePointer(fileId)
|
||||||
|
ctx.header("Access-Control-Allow-Origin", "*")
|
||||||
|
ctx.header("Content-Security-Policy", "sandbox allow-scripts")
|
||||||
|
if (ctx.req.query("attachment") == "1")
|
||||||
|
ctx.header("Content-Disposition", "attachment")
|
||||||
|
|
||||||
|
if (file) {
|
||||||
|
if (file.visibility == "private") {
|
||||||
|
if (acc?.id != file.owner) {
|
||||||
|
return ServeError(ctx, 403, "you do not own this file")
|
||||||
|
}
|
||||||
|
|
||||||
|
if (
|
||||||
|
auth.getType(auth.tokenFor(ctx)!) == "App" &&
|
||||||
|
auth
|
||||||
|
.getPermissions(auth.tokenFor(ctx)!)
|
||||||
|
?.includes("private")
|
||||||
|
) {
|
||||||
|
ServeError(ctx, 403, "insufficient permissions")
|
||||||
|
return
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
let range: Range | undefined
|
||||||
|
|
||||||
|
ctx.header("Content-Type", file.mime)
|
||||||
|
if (file.sizeInBytes) {
|
||||||
|
ctx.header("Content-Length", file.sizeInBytes.toString())
|
||||||
|
|
||||||
|
if (file.chunkSize) {
|
||||||
|
let range = ctx.range(file.sizeInBytes)
|
||||||
|
if (range) {
|
||||||
|
// error handling
|
||||||
|
if (typeof range == "number") {
|
||||||
|
return ctx.status(range == -1 ? 416 : 400)
|
||||||
|
}
|
||||||
|
if (range.type != "bytes") {
|
||||||
|
return ctx.status(400)
|
||||||
|
}
|
||||||
|
|
||||||
|
// set ranges var
|
||||||
|
let rngs = Array.from(range)
|
||||||
|
if (rngs.length != 1) {
|
||||||
|
return ctx.status(400)
|
||||||
|
}
|
||||||
|
range = rngs[0]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// supports ranges
|
||||||
|
|
||||||
|
return files
|
||||||
|
.readFileStream(fileId, range)
|
||||||
|
.then(async (stream) => {
|
||||||
|
if (range) {
|
||||||
|
ctx.status(206)
|
||||||
|
ctx.header(
|
||||||
|
"Content-Length",
|
||||||
|
(range.end - range.start + 1).toString()
|
||||||
|
)
|
||||||
|
ctx.header(
|
||||||
|
"Content-Range",
|
||||||
|
`bytes ${range.start}-${range.end}/${file.sizeInBytes}`
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
return ctx.stream((stre) => {
|
||||||
|
// Somehow return a stream?
|
||||||
|
})
|
||||||
|
})
|
||||||
|
.catch((err) => {
|
||||||
|
return ServeError(ctx, err.status, err.message)
|
||||||
|
})
|
||||||
|
} else {
|
||||||
|
return ServeError(ctx, 404, "file not found")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
|
// primaryApi.head(
|
||||||
// ["/file/:fileId", "/cpt/:fileId/*", "/:fileId"],
|
// ["/file/:fileId", "/cpt/:fileId/*", "/:fileId"],
|
||||||
// async (ctx) => {
|
// async (ctx) => {
|
||||||
// let acc = ctx.get("account") as Accounts.Account
|
// let file = files.getFilePointer(req.params.fileId)
|
||||||
|
|
||||||
|
// if (
|
||||||
|
// file.visibility == "private" &&
|
||||||
|
// (ctx.get("account")?.id != file.owner ||
|
||||||
|
// (auth.getType(auth.tokenFor(ctx)!) == "App" &&
|
||||||
|
// auth
|
||||||
|
// .getPermissions(auth.tokenFor(ctx)!)
|
||||||
|
// ?.includes("private")))
|
||||||
|
// ) {
|
||||||
|
// return ctx.status(403)
|
||||||
|
// }
|
||||||
|
|
||||||
// let file = files.getFilePointer(ctx.req.param("fileId"))
|
|
||||||
// ctx.header("Access-Control-Allow-Origin", "*")
|
|
||||||
// ctx.header("Content-Security-Policy", "sandbox allow-scripts")
|
// ctx.header("Content-Security-Policy", "sandbox allow-scripts")
|
||||||
|
|
||||||
// if (ctx.req.query("attachment") == "1")
|
// if (ctx.req.query("attachment") == "1")
|
||||||
// ctx.header("Content-Disposition", "attachment")
|
// ctx.header("Content-Disposition", "attachment")
|
||||||
|
|
||||||
// if (file) {
|
// if (!file) {
|
||||||
// if (file.visibility == "private") {
|
// res.status(404)
|
||||||
// if (acc?.id != file.owner) {
|
// res.send()
|
||||||
// return ServeError(ctx, 403, "you do not own this file")
|
// } else {
|
||||||
// }
|
|
||||||
|
|
||||||
// if (
|
|
||||||
// auth.getType(auth.tokenFor(ctx)!) == "App" &&
|
|
||||||
// auth
|
|
||||||
// .getPermissions(auth.tokenFor(ctx)!)
|
|
||||||
// ?.includes("private")
|
|
||||||
// ) {
|
|
||||||
// ServeError(ctx, 403, "insufficient permissions")
|
|
||||||
// return
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
|
|
||||||
// let range: Range | undefined
|
|
||||||
|
|
||||||
// ctx.header("Content-Type", file.mime)
|
// ctx.header("Content-Type", file.mime)
|
||||||
// if (file.sizeInBytes) {
|
// if (file.sizeInBytes) {
|
||||||
// ctx.header("Content-Length", file.sizeInBytes.toString())
|
// ctx.header("Content-Length", file.sizeInBytes)
|
||||||
|
// }
|
||||||
// if (file.chunkSize) {
|
// if (file.chunkSize) {
|
||||||
// let range = ctx.range(file.sizeInBytes)
|
// ctx.header("Accept-Ranges", "bytes")
|
||||||
// if (range) {
|
|
||||||
// // error handling
|
|
||||||
// if (typeof range == "number") {
|
|
||||||
// return ctx.status(range == -1 ? 416 : 400)
|
|
||||||
// }
|
// }
|
||||||
// if (range.type != "bytes") {
|
// res.send()
|
||||||
// return ctx.status(400)
|
|
||||||
// }
|
|
||||||
|
|
||||||
// // set ranges var
|
|
||||||
// let rngs = Array.from(range)
|
|
||||||
// if (rngs.length != 1) {
|
|
||||||
// return ctx.status(400)
|
|
||||||
// }
|
|
||||||
// range = rngs[0]
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
|
|
||||||
// // supports ranges
|
|
||||||
|
|
||||||
// return files
|
|
||||||
// .readFileStream(ctx.req.param("fileId"), range)
|
|
||||||
// .then(async (stream) => {
|
|
||||||
// if (range) {
|
|
||||||
// ctx.status(206)
|
|
||||||
// ctx.header(
|
|
||||||
// "Content-Length",
|
|
||||||
// (range.end - range.start + 1).toString()
|
|
||||||
// )
|
|
||||||
// ctx.header(
|
|
||||||
// "Content-Range",
|
|
||||||
// `bytes ${range.start}-${range.end}/${file.sizeInBytes}`
|
|
||||||
// )
|
|
||||||
// }
|
|
||||||
|
|
||||||
// return ctx.stream((stre) => {
|
|
||||||
// // Somehow return a stream?
|
|
||||||
// })
|
|
||||||
// })
|
|
||||||
// .catch((err) => {
|
|
||||||
// return ServeError(ctx, err.status, err.message)
|
|
||||||
// })
|
|
||||||
// } else {
|
|
||||||
// return ServeError(ctx, 404, "file not found")
|
|
||||||
// }
|
// }
|
||||||
// }
|
// }
|
||||||
// )
|
// )
|
||||||
|
|
||||||
// // primaryApi.head(
|
// upload handlers
|
||||||
// // ["/file/:fileId", "/cpt/:fileId/*", "/:fileId"],
|
|
||||||
// // async (ctx) => {
|
|
||||||
// // let file = files.getFilePointer(req.params.fileId)
|
|
||||||
|
|
||||||
// // if (
|
/*
|
||||||
// // file.visibility == "private" &&
|
primaryApi.post(
|
||||||
// // (ctx.get("account")?.id != file.owner ||
|
"/upload",
|
||||||
// // (auth.getType(auth.tokenFor(ctx)!) == "App" &&
|
requiresPermissions("upload"),
|
||||||
// // auth
|
multerSetup.single("file"),
|
||||||
// // .getPermissions(auth.tokenFor(ctx)!)
|
async (ctx) => {
|
||||||
// // ?.includes("private")))
|
let acc = ctx.get("account") as Accounts.Account
|
||||||
// // ) {
|
|
||||||
// // return ctx.status(403)
|
|
||||||
// // }
|
|
||||||
|
|
||||||
// // ctx.header("Content-Security-Policy", "sandbox allow-scripts")
|
if (req.file) {
|
||||||
|
try {
|
||||||
|
let prm = req.header("monofile-params")
|
||||||
|
let params: { [key: string]: any } = {}
|
||||||
|
if (prm) {
|
||||||
|
params = JSON.parse(prm)
|
||||||
|
}
|
||||||
|
|
||||||
// // if (ctx.req.query("attachment") == "1")
|
files
|
||||||
// // ctx.header("Content-Disposition", "attachment")
|
.uploadFile(
|
||||||
|
{
|
||||||
|
owner: acc?.id,
|
||||||
|
|
||||||
// // if (!file) {
|
uploadId: params.uploadId,
|
||||||
// // res.status(404)
|
filename: req.file.originalname,
|
||||||
// // res.send()
|
mime: req.file.mimetype,
|
||||||
// // } else {
|
},
|
||||||
// // ctx.header("Content-Type", file.mime)
|
req.file.buffer
|
||||||
// // if (file.sizeInBytes) {
|
)
|
||||||
// // ctx.header("Content-Length", file.sizeInBytes)
|
.then((uID) => res.send(uID))
|
||||||
// // }
|
.catch((stat) => {
|
||||||
// // if (file.chunkSize) {
|
res.status(stat.status)
|
||||||
// // ctx.header("Accept-Ranges", "bytes")
|
res.send(`[err] ${stat.message}`)
|
||||||
// // }
|
})
|
||||||
// // res.send()
|
} catch {
|
||||||
// // }
|
res.status(400)
|
||||||
// // }
|
res.send("[err] bad request")
|
||||||
// // )
|
}
|
||||||
|
} else {
|
||||||
|
res.status(400)
|
||||||
|
res.send("[err] bad request")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
// // upload handlers
|
primaryApi.post(
|
||||||
|
"/clone",
|
||||||
// primaryApi.post(
|
requiresPermissions("upload"),
|
||||||
// "/upload",
|
async ctx => {
|
||||||
// requiresPermissions("upload"),
|
let acc = ctx.get("account") as Accounts.Account
|
||||||
// multerSetup.single("file"),
|
|
||||||
// async (ctx) => {
|
|
||||||
// let acc = ctx.get("account") as Accounts.Account
|
|
||||||
|
|
||||||
// if (req.file) {
|
|
||||||
// try {
|
|
||||||
// let prm = req.header("monofile-params")
|
|
||||||
// let params: { [key: string]: any } = {}
|
|
||||||
// if (prm) {
|
|
||||||
// params = JSON.parse(prm)
|
|
||||||
// }
|
|
||||||
|
|
||||||
// files
|
|
||||||
// .uploadFile(
|
|
||||||
// {
|
|
||||||
// owner: acc?.id,
|
|
||||||
|
|
||||||
// uploadId: params.uploadId,
|
|
||||||
// filename: req.file.originalname,
|
|
||||||
// mime: req.file.mimetype,
|
|
||||||
// },
|
|
||||||
// req.file.buffer
|
|
||||||
// )
|
|
||||||
// .then((uID) => res.send(uID))
|
|
||||||
// .catch((stat) => {
|
|
||||||
// res.status(stat.status)
|
|
||||||
// res.send(`[err] ${stat.message}`)
|
|
||||||
// })
|
|
||||||
// } catch {
|
|
||||||
// res.status(400)
|
|
||||||
// res.send("[err] bad request")
|
|
||||||
// }
|
|
||||||
// } else {
|
|
||||||
// res.status(400)
|
|
||||||
// res.send("[err] bad request")
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
// )
|
|
||||||
|
|
||||||
// primaryApi.post(
|
|
||||||
// "/clone",
|
|
||||||
// requiresPermissions("upload"),
|
|
||||||
// async ctx => {
|
|
||||||
// let acc = ctx.get("account") as Accounts.Account
|
|
||||||
|
|
||||||
// try {
|
|
||||||
// return axios
|
|
||||||
// .get(req.body.url, { responseType: "arraybuffer" })
|
|
||||||
// .then((data: AxiosResponse) => {
|
|
||||||
// files
|
|
||||||
// .uploadFile(
|
|
||||||
// {
|
|
||||||
// owner: acc?.id,
|
|
||||||
// filename:
|
|
||||||
// req.body.url.split("/")[
|
|
||||||
// req.body.url.split("/").length - 1
|
|
||||||
// ] || "generic",
|
|
||||||
// mime: data.headers["content-type"],
|
|
||||||
// uploadId: req.body.uploadId,
|
|
||||||
// },
|
|
||||||
// Buffer.from(data.data)
|
|
||||||
// )
|
|
||||||
// .then((uID) => res.send(uID))
|
|
||||||
// .catch((stat) => {
|
|
||||||
// res.status(stat.status)
|
|
||||||
// res.send(`[err] ${stat.message}`)
|
|
||||||
// })
|
|
||||||
// })
|
|
||||||
// .catch((err) => {
|
|
||||||
// console.log(err)
|
|
||||||
// return res.text(`[err] failed to fetch data`, 400)
|
|
||||||
// })
|
|
||||||
// } catch {
|
|
||||||
// return ctx.text("[err] an error occured", 500)
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
// )
|
|
||||||
|
|
||||||
|
try {
|
||||||
|
return axios
|
||||||
|
.get(req.body.url, { responseType: "arraybuffer" })
|
||||||
|
.then((data: AxiosResponse) => {
|
||||||
|
files
|
||||||
|
.uploadFile(
|
||||||
|
{
|
||||||
|
owner: acc?.id,
|
||||||
|
filename:
|
||||||
|
req.body.url.split("/")[
|
||||||
|
req.body.url.split("/").length - 1
|
||||||
|
] || "generic",
|
||||||
|
mime: data.headers["content-type"],
|
||||||
|
uploadId: req.body.uploadId,
|
||||||
|
},
|
||||||
|
Buffer.from(data.data)
|
||||||
|
)
|
||||||
|
.then((uID) => res.send(uID))
|
||||||
|
.catch((stat) => {
|
||||||
|
res.status(stat.status)
|
||||||
|
res.send(`[err] ${stat.message}`)
|
||||||
|
})
|
||||||
|
})
|
||||||
|
.catch((err) => {
|
||||||
|
console.log(err)
|
||||||
|
return res.text(`[err] failed to fetch data`, 400)
|
||||||
|
})
|
||||||
|
} catch {
|
||||||
|
return ctx.text("[err] an error occured", 500)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
)
|
||||||
|
*/
|
||||||
return primaryApi
|
return primaryApi
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue