diff --git a/lib/user/privilege/IPrivilegeManager.js b/lib/user/privilege/IPrivilegeManager.js index a1cb8713..7780bf36 100644 --- a/lib/user/privilege/IPrivilegeManager.js +++ b/lib/user/privilege/IPrivilegeManager.js @@ -17,6 +17,12 @@ function requirePrivilege(privilege, arg, resource, callback) { } exports.requirePrivilege = requirePrivilege; function hasNoWriteLock(arg, resource, callback) { - resource.getLocks(function (e, locks) { return callback(e, locks ? locks.filter(function (l) { return l.user !== arg.user && l.lockKind.type.isSame(LockType_1.LockType.Write); }).length === 0 : false); }); + resource.getLocks(function (e, locks) { + var hasNoLock = locks ? locks.filter(function (l) { return l.user !== arg.user && l.lockKind.type.isSame(LockType_1.LockType.Write); }).length === 0 : false; + if (!hasNoLock || !resource.parent) + callback(e, hasNoLock); + else + hasNoWriteLock(arg, resource.parent, callback); + }); } exports.hasNoWriteLock = hasNoWriteLock; diff --git a/src/user/privilege/IPrivilegeManager.ts b/src/user/privilege/IPrivilegeManager.ts index b53494a7..38a8e4bd 100644 --- a/src/user/privilege/IPrivilegeManager.ts +++ b/src/user/privilege/IPrivilegeManager.ts @@ -83,5 +83,11 @@ export interface IPrivilegeManager export function hasNoWriteLock(arg : MethodCallArgs, resource : IResource, callback : PrivilegeManagerCallback) { - resource.getLocks((e, locks) => callback(e, locks ? locks.filter((l) => l.user !== arg.user && l.lockKind.type.isSame(LockType.Write)).length === 0 : false)); + resource.getLocks((e, locks) => { + const hasNoLock = locks ? locks.filter((l) => l.user !== arg.user && l.lockKind.type.isSame(LockType.Write)).length === 0 : false; + if(!hasNoLock || !resource.parent) + callback(e, hasNoLock); + else + hasNoWriteLock(arg, resource.parent, callback); + }); }