Skip to content

Commit d86753e

Browse files
authored
fix: incompatible AMPF with latest Nextcloud patches (#1097) (#1098)
Signed-off-by: Saw-jan <saw.jan.grg3e@gmail.com>
1 parent d123fbe commit d86753e

4 files changed

Lines changed: 69 additions & 25 deletions

File tree

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ and this project adheres to [Semantic Versioning](http://semver.org/).
3232
- Fix: Do not create OAuth client while updating OIDC setup [#1077](https://github.com/nextcloud/integration_openproject/pull/1077)
3333
- Fix: Handle invalid boolean auth-method value [#1079](https://github.com/nextcloud/integration_openproject/pull/1079)
3434
- Fix: False integration setup status even after complete oauth setup [#1088](https://github.com/nextcloud/integration_openproject/pull/1088)
35+
- Fix: Incompatible AMPF with the latest Nextcloud patch releases [#1098](https://github.com/nextcloud/integration_openproject/pull/1098)
3536

3637
## 3.1.0 - 2026-06-18
3738

lib/AppInfo/Application.php

Lines changed: 17 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
use OCA\OpenProject\Listener\OpenProjectReferenceListener;
2222
use OCA\OpenProject\Listener\TermsOfServiceEventListener;
2323
use OCA\OpenProject\Listener\UserChangedListener;
24+
use OCA\OpenProject\Listener\UserLoggedInEventListener;
2425
use OCA\OpenProject\Reference\WorkPackageReferenceProvider;
2526
use OCA\OpenProject\Search\OpenProjectSearchProvider;
2627
use OCA\TermsOfService\Events\SignaturesResetEvent;
@@ -32,7 +33,6 @@
3233
use OCP\AppFramework\Bootstrap\IRegistrationContext;
3334
use OCP\AppFramework\OCS\OCSBadRequestException;
3435
use OCP\Collaboration\Reference\RenderReferenceEvent;
35-
use OCP\EventDispatcher\IEventDispatcher;
3636
use OCP\Files\Events\Node\BeforeNodeDeletedEvent;
3737
use OCP\Files\Events\Node\BeforeNodeRenamedEvent;
3838
use OCP\Group\Events\BeforeGroupDeletedEvent;
@@ -46,6 +46,7 @@
4646
use OCP\IUserSession;
4747
use OCP\User\Events\BeforeUserDeletedEvent;
4848
use OCP\User\Events\UserChangedEvent;
49+
use OCP\User\Events\UserLoggedInEvent;
4950
use Psr\Log\LoggerInterface;
5051
use Symfony\Component\HttpFoundation\Request;
5152

@@ -117,18 +118,26 @@ public function register(IRegistrationContext $context): void {
117118
$context->registerSearchProvider(OpenProjectSearchProvider::class);
118119

119120
// register sidebar tab
120-
$context->registerEventListener(
121-
LoadSidebar::class,
122-
LoadSidebarScript::class
123-
);
121+
$context->registerEventListener(LoadSidebar::class, LoadSidebarScript::class);
124122
$context->registerEventListener(LoadAdditionalScriptsEvent::class, LoadAdditionalScriptsListener::class);
125-
126123
$context->registerEventListener(
127-
BeforeNodeDeletedEvent::class, BeforeNodeInsideOpenProjectGroupfilderChangedListener::class
124+
BeforeNodeDeletedEvent::class,
125+
BeforeNodeInsideOpenProjectGroupfilderChangedListener::class,
128126
);
129127
$context->registerEventListener(
130-
BeforeNodeRenamedEvent::class, BeforeNodeInsideOpenProjectGroupfilderChangedListener::class
128+
BeforeNodeRenamedEvent::class,
129+
BeforeNodeInsideOpenProjectGroupfilderChangedListener::class,
131130
);
131+
$context->registerEventListener(BeforeUserDeletedEvent::class, BeforeUserDeletedListener::class);
132+
$context->registerEventListener(BeforeGroupDeletedEvent::class, BeforeGroupDeletedListener::class);
133+
$context->registerEventListener(UserChangedEvent::class, UserChangedListener::class);
134+
$context->registerEventListener(UserLoggedInEvent::class, UserLoggedInEventListener::class);
135+
$context->registerEventListener(AppEnableEvent::class, TermsOfServiceEventListener::class);
136+
137+
/** @psalm-suppress InvalidArgument */
138+
$context->registerEventListener(SignaturesResetEvent::class, TermsOfServiceEventListener::class);
139+
/** @psalm-suppress InvalidArgument */
140+
$context->registerEventListener(TermsCreatedEvent::class, TermsOfServiceEventListener::class);
132141

133142
if (version_compare($this->config->getSystemValueString('version', '0.0.0'), '26.0.0', '>=')) {
134143
$context->registerReferenceProvider(WorkPackageReferenceProvider::class);
@@ -141,17 +150,6 @@ public function register(IRegistrationContext $context): void {
141150
public function boot(IBootContext $context): void {
142151
$context->injectFn(Closure::fromCallable([$this, 'listenRemoveUserFromGroupRequest']));
143152
$context->injectFn(Closure::fromCallable([$this, 'registerNavigation']));
144-
/** @var IEventDispatcher $dispatcher */
145-
$dispatcher = $context->getAppContainer()->get(IEventDispatcher::class);
146-
$dispatcher->addServiceListener(BeforeUserDeletedEvent::class, BeforeUserDeletedListener::class);
147-
$dispatcher->addServiceListener(BeforeGroupDeletedEvent::class, BeforeGroupDeletedListener::class);
148-
$dispatcher->addServiceListener(UserChangedEvent::class, UserChangedListener::class);
149-
/** @psalm-suppress InvalidArgument AppEnableEvent event is not in stable25 so making psalm not complain*/
150-
$dispatcher->addServiceListener(AppEnableEvent::class, TermsOfServiceEventListener::class);
151-
/** @psalm-suppress InvalidArgument TermsCreatedEvent event is not yet registered in terms_of_service app, so making psalm not complain */
152-
$dispatcher->addServiceListener(TermsCreatedEvent::class, TermsOfServiceEventListener::class);
153-
/** @psalm-suppress InvalidArgument SignaturesResetEvent event is not yet registered in terms_of_service app, so making psalm not complain*/
154-
$dispatcher->addServiceListener(SignaturesResetEvent::class, TermsOfServiceEventListener::class);
155153
}
156154

157155
public function registerNavigation(IUserSession $userSession): void {
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
/**
6+
* SPDX-FileCopyrightText: 2026 Jankari Tech Pvt. Ltd.
7+
* SPDX-License-Identifier: AGPL-3.0-or-later
8+
*/
9+
10+
namespace OCA\OpenProject\Listener;
11+
12+
use OCA\OpenProject\AppInfo\Application;
13+
use OCP\AppFramework\Utility\ITimeFactory;
14+
use OCP\EventDispatcher\Event;
15+
use OCP\EventDispatcher\IEventListener;
16+
use OCP\ISession;
17+
use OCP\User\Events\UserLoggedInEvent;
18+
19+
/**
20+
* @template-implements IEventListener<UserLoggedInEvent>
21+
*/
22+
class UserLoggedInEventListener implements IEventListener {
23+
public function __construct(
24+
private ISession $session,
25+
private ITimeFactory $timeFactory,
26+
) {
27+
}
28+
29+
/**
30+
* @param UserLoggedInEvent $event
31+
*
32+
* @return void
33+
*/
34+
public function handle(Event $event): void {
35+
if (!($event instanceof UserLoggedInEvent)) {
36+
return;
37+
}
38+
39+
if ($event->getUid() === Application::OPEN_PROJECT_ENTITIES_NAME && $event->isTokenLogin()) {
40+
// set the last-password-confirm session variable to allow OpenProject user
41+
// to perform actions using app-password without requiring password confirmation
42+
$this->session->set('last-password-confirm', $this->timeFactory->getTime());
43+
}
44+
}
45+
}

tests/acceptance/features/api/teamFolder.feature

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ Feature: setup the integration through an API
5050
When user "Carol" deletes folder "/OpenProject/OpenProject/project-test"
5151
Then the HTTP status code should be 204
5252

53-
@expect-fail
53+
5454
Scenario: check OpenProjectNoAutomaticProjectFolders group after user is removed from OpenProject group (removed by group admin)
5555
Given user "Carol" has been created
5656
And user "Carol" has been added to the group "OpenProject"
@@ -59,7 +59,7 @@ Feature: setup the integration through an API
5959
And user "Carol" should belong to group "OpenProjectNoAutomaticProjectFolders"
6060
And user "Carol" should not belong to group "OpenProject"
6161

62-
@expect-fail
62+
6363
Scenario: user not in OpenProject group is removed from another group (removed by group admin)
6464
Given group "grp1" has been created
6565
And user "Carol" has been created
@@ -74,7 +74,7 @@ Feature: setup the integration through an API
7474
And user "Carol" should belong to group "grp1"
7575
And user "Carol" should not belong to group "OpenProjectNoAutomaticProjectFolders"
7676

77-
@expect-fail
77+
7878
Scenario: user not in OpenProject group but has multiple group memberships is removed from one group (removed by group admin)
7979
Given group "grp1" has been created
8080
And group "grp2" has been created
@@ -94,7 +94,7 @@ Feature: setup the integration through an API
9494
| Carol | OpenProjectNoAutomaticProjectFolders |
9595
And user "Carol" should belong to group "grp2"
9696

97-
@expect-fail
97+
9898
Scenario: user in OpenProject and other groups (removed by group admin)
9999
Given group "grp1" has been created
100100
And user "Carol" has been created
@@ -118,7 +118,7 @@ Feature: setup the integration through an API
118118
And user "Carol" should belong to group "OpenProjectNoAutomaticProjectFolders"
119119
And user "Carol" should not belong to group "OpenProject"
120120

121-
@expect-fail
121+
122122
Scenario: multiple user in OpenProject groups and only one gets removed (removed by group admin)
123123
Given user "Alex" has been created
124124
And user "Brian" has been created
@@ -137,7 +137,7 @@ Feature: setup the integration through an API
137137
| Brian | OpenProjectNoAutomaticProjectFolders |
138138
| Carol | OpenProject |
139139

140-
@expect-fail
140+
141141
Scenario: user is in multiple groups including OpenProject and is removed from another group (removed by group admin)
142142
Given group "grp1" has been created
143143
And user "Carol" has been created

0 commit comments

Comments
 (0)