mirror of
https://github.com/HeyPuter/puter.git
synced 2025-12-30 17:50:00 -06:00
fix: incorrect implementation of ll_mkdir
When ll_mkdir functionality was moved to PuterFSProvider, ACL and FSLock concerns were erroneously moved into PuterFSProvider. The intended design has ll_mkdir responsible for ACL and FSLock, and providers should never be responsible for ACL.
This commit is contained in:
@@ -156,66 +156,55 @@ class PuterFSProvider {
|
||||
async mkdir ({ context, parent, name, immutable }) {
|
||||
const { actor, thumbnail } = context.values;
|
||||
|
||||
const lock_handle = await svc_fsLock.lock_child(await parent.get('path'),
|
||||
name,
|
||||
MODE_WRITE);
|
||||
const ts = Math.round(Date.now() / 1000);
|
||||
const uid = uuidv4();
|
||||
|
||||
try {
|
||||
const ts = Math.round(Date.now() / 1000);
|
||||
const uid = uuidv4();
|
||||
const existing = await svc_fs.node(new NodeChildSelector(parent.selector, name));
|
||||
|
||||
const existing = await svc_fs.node(new NodeChildSelector(parent.selector, name));
|
||||
|
||||
if ( await existing.exists() ) {
|
||||
throw APIError.create('item_with_same_name_exists', null, {
|
||||
entry_name: name,
|
||||
});
|
||||
}
|
||||
|
||||
if ( ! await parent.exists() ) {
|
||||
throw APIError.create('subject_does_not_exist');
|
||||
}
|
||||
if ( ! await svc_acl.check(actor, parent, 'write') ) {
|
||||
throw await svc_acl.get_safe_acl_error(actor, parent, 'write');
|
||||
}
|
||||
|
||||
svc_resource.register({
|
||||
uid,
|
||||
status: RESOURCE_STATUS_PENDING_CREATE,
|
||||
if ( await existing.exists() ) {
|
||||
throw APIError.create('item_with_same_name_exists', null, {
|
||||
entry_name: name,
|
||||
});
|
||||
|
||||
const raw_fsentry = {
|
||||
is_dir: 1,
|
||||
uuid: uid,
|
||||
parent_uid: await parent.get('uid'),
|
||||
path: path_.join(await parent.get('path'), name),
|
||||
user_id: actor.type.user.id,
|
||||
name,
|
||||
created: ts,
|
||||
accessed: ts,
|
||||
modified: ts,
|
||||
immutable: immutable ?? false,
|
||||
...(thumbnail ? {
|
||||
thumbnail: thumbnail,
|
||||
} : {}),
|
||||
};
|
||||
|
||||
const entryOp = await svc_fsEntry.insert(raw_fsentry);
|
||||
|
||||
await entryOp.awaitDone();
|
||||
svc_resource.free(uid);
|
||||
|
||||
const node = await svc_fs.node(new NodeUIDSelector(uid));
|
||||
|
||||
svc_event.emit('fs.create.directory', {
|
||||
node,
|
||||
context: Context.get(),
|
||||
});
|
||||
|
||||
return node;
|
||||
} finally {
|
||||
await lock_handle.unlock();
|
||||
}
|
||||
|
||||
if ( ! await parent.exists() ) {
|
||||
throw APIError.create('subject_does_not_exist');
|
||||
}
|
||||
|
||||
svc_resource.register({
|
||||
uid,
|
||||
status: RESOURCE_STATUS_PENDING_CREATE,
|
||||
});
|
||||
|
||||
const raw_fsentry = {
|
||||
is_dir: 1,
|
||||
uuid: uid,
|
||||
parent_uid: await parent.get('uid'),
|
||||
path: path_.join(await parent.get('path'), name),
|
||||
user_id: actor.type.user.id,
|
||||
name,
|
||||
created: ts,
|
||||
accessed: ts,
|
||||
modified: ts,
|
||||
immutable: immutable ?? false,
|
||||
...(thumbnail ? {
|
||||
thumbnail: thumbnail,
|
||||
} : {}),
|
||||
};
|
||||
|
||||
const entryOp = await svc_fsEntry.insert(raw_fsentry);
|
||||
|
||||
await entryOp.awaitDone();
|
||||
svc_resource.free(uid);
|
||||
|
||||
const node = await svc_fs.node(new NodeUIDSelector(uid));
|
||||
|
||||
svc_event.emit('fs.create.directory', {
|
||||
node,
|
||||
context: Context.get(),
|
||||
});
|
||||
|
||||
return node;
|
||||
}
|
||||
|
||||
async read ({ context, node, version_id, range }) {
|
||||
|
||||
@@ -18,7 +18,6 @@
|
||||
*/
|
||||
const APIError = require('../../api/APIError');
|
||||
const { MODE_WRITE } = require('../../services/fs/FSLockService');
|
||||
const { Context } = require('../../util/context');
|
||||
const { NodeUIDSelector, NodeChildSelector } = require('../node/selectors');
|
||||
const { RESOURCE_STATUS_PENDING_CREATE } = require('../../modules/puterfs/ResourceService');
|
||||
const { LLFilesystemOperation } = require('./definitions');
|
||||
@@ -32,12 +31,36 @@ class LLMkdir extends LLFilesystemOperation {
|
||||
|
||||
async _run () {
|
||||
const { parent, name, immutable } = this.values;
|
||||
return await parent.provider.mkdir({
|
||||
context: this.context,
|
||||
parent,
|
||||
|
||||
const actor = this.values.actor ?? this.context.get('actor');
|
||||
|
||||
const services = this.context.get('services');
|
||||
|
||||
const svc_fsLock = services.get('fslock');
|
||||
const svc_acl = services.get('acl');
|
||||
|
||||
/* eslint-disable */ // -- Please fix this linter rule
|
||||
const lock_handle = await svc_fsLock.lock_child(
|
||||
await parent.get('path'),
|
||||
name,
|
||||
immutable,
|
||||
});
|
||||
MODE_WRITE,
|
||||
);
|
||||
/* eslint-enable */
|
||||
|
||||
try {
|
||||
if ( ! await svc_acl.check(actor, parent, 'write') ) {
|
||||
throw await svc_acl.get_safe_acl_error(actor, parent, 'write');
|
||||
}
|
||||
|
||||
return await parent.provider.mkdir({
|
||||
context: this.context,
|
||||
parent,
|
||||
name,
|
||||
immutable,
|
||||
});
|
||||
} finally {
|
||||
lock_handle.unlock();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user