Fix shared upload permissions for capability-restricted LTX backend
This commit is contained in:
+4
-3
@@ -1,7 +1,7 @@
|
||||
import http from 'node:http'
|
||||
import https from 'node:https'
|
||||
import { createReadStream, createWriteStream } from 'node:fs'
|
||||
import { readFile, mkdir, realpath, stat, unlink, copyFile } from 'node:fs/promises'
|
||||
import { readFile, mkdir, realpath, stat, unlink, copyFile, chmod } from 'node:fs/promises'
|
||||
import path from 'node:path'
|
||||
import { randomBytes, randomUUID, timingSafeEqual, createHash } from 'node:crypto'
|
||||
import { pipeline } from 'node:stream/promises'
|
||||
@@ -119,7 +119,7 @@ export async function createApp(config) {
|
||||
if(Number(req.headers['content-length'])>limit)throw fail(413,'Upload too large')
|
||||
const target=outputName(ext);let size=0
|
||||
const limiter=new Transform({transform(chunk,_encoding,done){size+=chunk.length;done(size>limit?fail(413,'Upload too large'):null,chunk)}})
|
||||
try {await pipeline(req,limiter,createWriteStream(target.local,{flags:'wx',mode:0o600}))} catch(e){await unlink(target.local).catch(()=>{});throw e}
|
||||
try {await pipeline(req,limiter,createWriteStream(target.local,{flags:'wx',mode:0o640}));await chmod(target.local,0o640)} catch(e){await unlink(target.local).catch(()=>{});throw e}
|
||||
return json(res,201,{success:true,path:target.backend})
|
||||
}
|
||||
if(url.pathname==='/web/files'&&req.method==='POST') {
|
||||
@@ -131,7 +131,7 @@ export async function createApp(config) {
|
||||
const source=await resolveMedia(p.path)
|
||||
if(p.action==='prepare')return json(res,200,{success:true,path:p.path})
|
||||
if(p.action==='copy') {
|
||||
const target=outputName(path.extname(source));await copyFile(source,target.local);return json(res,200,{success:true,path:target.backend})
|
||||
const target=outputName(path.extname(source));await copyFile(source,target.local);await chmod(target.local,0o640);return json(res,200,{success:true,path:target.backend})
|
||||
}
|
||||
if(p.action==='metadata'||p.action==='thumbnail'||p.action==='frame') {
|
||||
if(p.action==='metadata') {
|
||||
@@ -143,6 +143,7 @@ export async function createApp(config) {
|
||||
if(!Number.isFinite(time)||time<0)throw fail(400,'Invalid frame time')
|
||||
const target=outputName('.jpg')
|
||||
await exec('ffmpeg',['-nostdin','-v','error','-ss',String(time),'-protocol_whitelist','file,pipe','-i',source,'-frames:v','1','-vf','scale=960:-2','-y',target.local],{timeout:60000,maxBuffer:1024*1024})
|
||||
await chmod(target.local,0o640)
|
||||
return json(res,200,{success:true,path:target.backend,bigThumbnailPath:target.backend,smallThumbnailPath:target.backend})
|
||||
}
|
||||
throw fail(400,'Unsupported file operation')
|
||||
|
||||
Reference in New Issue
Block a user