Skip to content

Commit e2cc7f9

Browse files
authored
Merge pull request #440 from nextcloud/backport/391/stable29
[stable29] Allow force unlock of automated client locks
2 parents 06c8f0d + 8424643 commit e2cc7f9

13 files changed

+2317
-249
lines changed

.gitignore

+1
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
\.idea/
33

44
/build/
5+
/css/
56
/js/
67
/vendor/
78
/node_modules/

lib/DAV/LockBackend.php

+1-3
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,6 @@
3939
use OCP\Files\NotFoundException;
4040
use Sabre\DAV\Locks\Backend\BackendInterface;
4141
use Sabre\DAV\Locks\LockInfo;
42-
use Sabre\DAV\Server;
4342

4443
class LockBackend implements BackendInterface {
4544
/** @var FileService */
@@ -52,9 +51,8 @@ class LockBackend implements BackendInterface {
5251
private $absolute = false;
5352

5453
public function __construct(
55-
Server $server, FileService $fileService, LockService $lockService, bool $absolute
54+
FileService $fileService, LockService $lockService, bool $absolute
5655
) {
57-
$this->server = $server;
5856
$this->fileService = $fileService;
5957
$this->lockService = $lockService;
6058
$this->absolute = $absolute;

lib/DAV/LockPlugin.php

+1-1
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ public function initialize(Server $server) {
5858
$absolute = true;
5959
break;
6060
}
61-
$this->locksBackend = new LockBackend($server, $this->fileService, $this->lockService, $absolute);
61+
$this->locksBackend = new LockBackend($this->fileService, $this->lockService, $absolute);
6262
$server->on('propFind', [$this, 'customProperties']);
6363
parent::initialize($server);
6464
}

lib/Db/LocksRequest.php

+6-5
Original file line numberDiff line numberDiff line change
@@ -49,11 +49,12 @@ class LocksRequest extends LocksRequestBuilder {
4949
public function save(FileLock $lock) {
5050
$qb = $this->getLocksInsertSql();
5151
$qb->setValue('user_id', $qb->createNamedParameter($lock->getOwner()))
52-
->setValue('file_id', $qb->createNamedParameter($lock->getFileId()))
53-
->setValue('token', $qb->createNamedParameter($lock->getToken()))
54-
->setValue('creation', $qb->createNamedParameter($lock->getCreatedAt()))
55-
->setValue('type', $qb->createNamedParameter($lock->getType()))
56-
->setValue('ttl', $qb->createNamedParameter($lock->getTimeout()));
52+
->setValue('file_id', $qb->createNamedParameter($lock->getFileId()))
53+
->setValue('token', $qb->createNamedParameter($lock->getToken()))
54+
->setValue('creation', $qb->createNamedParameter($lock->getCreatedAt()))
55+
->setValue('type', $qb->createNamedParameter($lock->getType()))
56+
->setValue('ttl', $qb->createNamedParameter($lock->getTimeout()))
57+
->setValue('owner', $qb->createNamedParameter($lock->getDisplayName()));
5758

5859
try {
5960
$qb->execute();

lib/Listeners/LoadAdditionalScripts.php

+1
Original file line numberDiff line numberDiff line change
@@ -46,5 +46,6 @@ public function handle(Event $event): void {
4646

4747
Util::addInitScript(Application::APP_ID, 'files_lock-init');
4848
Util::addScript(Application::APP_ID, 'files_lock-main');
49+
Util::addStyle(Application::APP_ID, 'files_lock-main');
4950
}
5051
}

lib/Service/LockService.php

+26-2
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@
4646
use OCP\Files\Lock\OwnerLockedException;
4747
use OCP\Files\NotFoundException;
4848
use OCP\IL10N;
49+
use OCP\IRequest;
4950
use OCP\IUserManager;
5051
use OCP\IUserSession;
5152

@@ -65,6 +66,7 @@ class LockService {
6566
private IAppManager $appManager;
6667
private IEventDispatcher $eventDispatcher;
6768
private IUserSession $userSession;
69+
private IRequest $request;
6870

6971

7072
private array $locks = [];
@@ -83,6 +85,7 @@ public function __construct(
8385
IAppManager $appManager,
8486
IEventDispatcher $eventDispatcher,
8587
IUserSession $userSession,
88+
IRequest $request,
8689
) {
8790
$this->l10n = $l10n;
8891
$this->userManager = $userManager;
@@ -92,6 +95,7 @@ public function __construct(
9295
$this->appManager = $appManager;
9396
$this->eventDispatcher = $eventDispatcher;
9497
$this->userSession = $userSession;
98+
$this->request = $request;
9599

96100
$this->setup('app', 'files_lock');
97101
}
@@ -184,9 +188,9 @@ public function lock(LockContext $lockScope): FileLock {
184188
$this->generateToken($lock);
185189
$lock->setCreation(time());
186190
$this->notice('locking file', false, ['fileLock' => $lock]);
191+
$this->injectMetadata($lock);
187192
$this->locksRequest->save($lock);
188193
$this->propagateEtag($lockScope);
189-
$this->injectMetadata($lock);
190194
return $lock;
191195
}
192196
}
@@ -339,7 +343,11 @@ public function injectMetadata(FileLock $lock): FileLock {
339343
$displayName = $this->getAppName($lock->getOwner()) ?? null;
340344
}
341345
if ($lock->getType() === ILock::TYPE_TOKEN) {
342-
$displayName = $this->userManager->getDisplayName($lock->getOwner()) ?? $lock->getDisplayName();
346+
$clientHint = $this->getClientHint();
347+
$displayName = $lock->getDisplayName() ?: (
348+
$this->userManager->getDisplayName($lock->getOwner()) . ' ' .
349+
($clientHint ? ('(' . $clientHint . ')') : '')
350+
);
343351
}
344352

345353
if ($displayName) {
@@ -348,6 +356,22 @@ public function injectMetadata(FileLock $lock): FileLock {
348356
return $lock;
349357
}
350358

359+
private function getClientHint(): ?string {
360+
if ($this->request->isUserAgent([IRequest::USER_AGENT_CLIENT_DESKTOP])) {
361+
return $this->l10n->t('Desktop client');
362+
}
363+
364+
if ($this->request->isUserAgent([IRequest::USER_AGENT_CLIENT_IOS])) {
365+
return $this->l10n->t('iOS client');
366+
}
367+
368+
if ($this->request->isUserAgent([IRequest::USER_AGENT_CLIENT_ANDROID])) {
369+
return $this->l10n->t('Android client');
370+
}
371+
372+
return null;
373+
}
374+
351375
/**
352376
* @param FileLock $lock
353377
*/

0 commit comments

Comments
 (0)