|
1 | 1 | import { HTTPCodes, MethodCallArgs, WebDAVRequest } from '../WebDAVRequest'
|
2 |
| -import { IResource, ETag } from '../../resource/IResource' |
| 2 | +import { IResource, ETag, ReturnCallback } from '../../resource/IResource' |
3 | 3 | import { BasicPrivilege } from '../../user/privilege/IPrivilegeManager'
|
| 4 | +import { FSPath } from '../../manager/FSPath' |
| 5 | +import { Lock } from '../../resource/lock/Lock' |
4 | 6 | import { XML } from '../../helper/XML'
|
5 | 7 | import * as http from 'http'
|
6 | 8 |
|
| 9 | +function lockDiscovery(arg : MethodCallArgs, path : FSPath, resource : IResource, callback : ReturnCallback<any>) |
| 10 | +{ |
| 11 | + arg.requireErPrivilege('canListLocks', resource, (e, can) => { |
| 12 | + if(e || !can) |
| 13 | + { |
| 14 | + callback(e, {}); |
| 15 | + return; |
| 16 | + } |
| 17 | + |
| 18 | + resource.getLocks((e, locks) => { |
| 19 | + if(resource.parent) |
| 20 | + { |
| 21 | + const parentPath = path.getParent(); |
| 22 | + lockDiscovery(arg, parentPath, resource.parent, (e, l) => { |
| 23 | + if(e) |
| 24 | + callback(e, null); |
| 25 | + else |
| 26 | + { |
| 27 | + l[path.toString()] = locks; |
| 28 | + callback(null, l); |
| 29 | + } |
| 30 | + }); |
| 31 | + } |
| 32 | + else |
| 33 | + callback(null, { |
| 34 | + [path.toString()]: locks |
| 35 | + }); |
| 36 | + }); |
| 37 | + }) |
| 38 | +} |
| 39 | + |
7 | 40 | export default function(arg : MethodCallArgs, callback)
|
8 | 41 | {
|
9 | 42 | arg.getResource((e, resource) => {
|
@@ -108,8 +141,38 @@ export default function(arg : MethodCallArgs, callback)
|
108 | 141 |
|
109 | 142 | arg.getResourcePath(resource, (e, path) => {
|
110 | 143 | if(!e)
|
| 144 | + { |
111 | 145 | response.ele('D:href').add(arg.fullUri(path).replace(' ', '%20'));
|
112 |
| - nbOut(e); |
| 146 | + const lockdiscovery = prop.ele('D:lockdiscovery'); |
| 147 | + lockDiscovery(arg, new FSPath(path), resource, (e, l) => { |
| 148 | + if(e) |
| 149 | + { |
| 150 | + nbOut(e); |
| 151 | + return; |
| 152 | + } |
| 153 | + |
| 154 | + for(const path in l) |
| 155 | + { |
| 156 | + for(const _lock of l[path]) |
| 157 | + { |
| 158 | + const lock : Lock = _lock; |
| 159 | + const activelock = lockdiscovery.ele('D:activelock'); |
| 160 | + |
| 161 | + activelock.ele('D:lockscope').ele('D:' + lock.lockKind.scope.value.toLowerCase()) |
| 162 | + activelock.ele('D:locktype').ele('D:' + lock.lockKind.type.value.toLowerCase()) |
| 163 | + activelock.ele('D:depth').add('Infinity') |
| 164 | + activelock.ele('D:owner').add(lock.owner) |
| 165 | + activelock.ele('D:timeout').add('Second-' + (lock.expirationDate - Date.now())) |
| 166 | + activelock.ele('D:locktoken').ele('D:href').add(lock.uuid) |
| 167 | + activelock.ele('D:lockroot').ele('D:href').add(arg.fullUri(path).replace(' ', '%20')) |
| 168 | + } |
| 169 | + } |
| 170 | + |
| 171 | + nbOut(null); |
| 172 | + }) |
| 173 | + } |
| 174 | + else |
| 175 | + nbOut(e); |
113 | 176 | })
|
114 | 177 |
|
115 | 178 | resource.webName((e, name) => process.nextTick(() => {
|
|
0 commit comments