Skip to content

Commit 980b9ad

Browse files
committed
fixup! feat: track overly long activities
1 parent 269c37c commit 980b9ad

3 files changed

Lines changed: 128 additions & 31 deletions

File tree

lib/private/Activity/Event.php

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -150,16 +150,16 @@ public function setSubject(string $subject, array $parameters = []): IEvent {
150150
}
151151

152152
$counter = $this->appConfig->getValueInt('activity', 'overly_long_activities', 0);
153-
foreach ($parameters as $parameter) {
154-
if (strlen($parameter) > 4000) {
155-
$counter++;
156-
$this->logger->error('Activity with over 4000 characters detected', [
157-
158-
]);
159-
} elseif (strlen($parameter) > 2000) {
160-
$counter++;
161-
$this->logger->warning('Activity with over 2000 characters detected', ['app' => $this->getApp()]);
162-
}
153+
$return = [];
154+
array_walk_recursive($parameters, static function ($a) use (&$return) { $return[] = $a; });
155+
$parameter = implode('', $return);
156+
157+
if (strlen($parameter) > 4000) {
158+
$counter++;
159+
$this->logger->error('Activity with over 4000 characters detected', ['app' => $this->getApp()]);
160+
} elseif (strlen($parameter) > 2000) {
161+
$counter++;
162+
$this->logger->warning('Activity with over 2000 characters detected', ['app' => $this->getApp()]);
163163
}
164164

165165
if ($counter !== 0) {

lib/private/Activity/Manager.php

Lines changed: 14 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -30,18 +30,10 @@
3030
use Psr\Log\LoggerInterface;
3131

3232
class Manager implements IManager {
33-
34-
/** @var string */
35-
protected $formattingObjectType;
36-
37-
/** @var int|string */
38-
protected $formattingObjectId;
39-
40-
/** @var bool */
41-
protected $requirePNG = false;
42-
43-
/** @var string */
44-
protected $currentUserId;
33+
protected string $formattingObjectType;
34+
protected string|int $formattingObjectId;
35+
protected bool $requirePNG = false;
36+
protected ?string $currentUserId;
4537

4638
public function __construct(
4739
protected IRequest $request,
@@ -54,16 +46,17 @@ public function __construct(
5446
protected IAppConfig $appConfig,
5547
protected LoggerInterface $logger,
5648
) {
49+
$this->currentUserId = $this->session->getUser()?->getUID();
5750
}
5851

5952
/** @var \Closure[] */
60-
private $consumersClosures = [];
53+
private array $consumersClosures = [];
6154

6255
/** @var IConsumer[] */
63-
private $consumers = [];
56+
private array $consumers = [];
6457

6558
/**
66-
* @return \OCP\Activity\IConsumer[]
59+
* @return IConsumer[]
6760
*/
6861
protected function getConsumers(): array {
6962
if (!empty($this->consumers)) {
@@ -167,10 +160,10 @@ public function registerConsumer(\Closure $callable): void {
167160
}
168161

169162
/** @var string[] */
170-
protected $filterClasses = [];
163+
protected array $filterClasses = [];
171164

172165
/** @var IFilter[] */
173-
protected $filters = [];
166+
protected array $filters = [];
174167

175168
/**
176169
* @param string $filter Class must implement OCA\Activity\IFilter
@@ -214,10 +207,10 @@ public function getFilterById(string $id): IFilter {
214207
}
215208

216209
/** @var string[] */
217-
protected $providerClasses = [];
210+
protected array $providerClasses = [];
218211

219212
/** @var IProvider[] */
220-
protected $providers = [];
213+
protected array $providers = [];
221214

222215
/**
223216
* @param string $provider Class must implement OCA\Activity\IProvider
@@ -248,10 +241,10 @@ public function getProviders(): array {
248241
}
249242

250243
/** @var string[] */
251-
protected $settingsClasses = [];
244+
protected array $settingsClasses = [];
252245

253246
/** @var ISetting[] */
254-
protected $settings = [];
247+
protected array $settings = [];
255248

256249
/**
257250
* @param string $setting Class must implement OCA\Activity\ISetting

tests/lib/Activity/ManagerTest.php

Lines changed: 104 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,11 +10,13 @@
1010

1111
namespace Test\Activity;
1212

13+
use OC;
1314
use OC\Activity\Manager;
1415
use OCP\Activity\Exceptions\IncompleteActivityException;
1516
use OCP\Activity\IConsumer;
1617
use OCP\Activity\IEvent;
1718
use OCP\AppFramework\Utility\ITimeFactory;
19+
use OCP\IAppConfig;
1820
use OCP\IConfig;
1921
use OCP\IL10N;
2022
use OCP\IRequest;
@@ -23,6 +25,7 @@
2325
use OCP\RichObjectStrings\IRichTextFormatter;
2426
use OCP\RichObjectStrings\IValidator;
2527
use PHPUnit\Framework\MockObject\MockObject;
28+
use Psr\Log\LoggerInterface;
2629
use Test\TestCase;
2730

2831
class ManagerTest extends TestCase {
@@ -34,6 +37,8 @@ class ManagerTest extends TestCase {
3437
protected IValidator&MockObject $validator;
3538
protected IRichTextFormatter&MockObject $richTextFormatter;
3639
private ITimeFactory&MockObject $time;
40+
private IAppConfig $appConfig;
41+
private LoggerInterface&MockObject $logger;
3742

3843
protected function setUp(): void {
3944
parent::setUp();
@@ -44,6 +49,8 @@ protected function setUp(): void {
4449
$this->validator = $this->createMock(IValidator::class);
4550
$this->richTextFormatter = $this->createMock(IRichTextFormatter::class);
4651
$this->time = $this->createMock(ITimeFactory::class);
52+
$this->appConfig = OC::$server->get(IAppConfig::class);
53+
$this->logger = $this->createMock(LoggerInterface::class);
4754

4855
$this->activityManager = new Manager(
4956
$this->request,
@@ -53,6 +60,8 @@ protected function setUp(): void {
5360
$this->richTextFormatter,
5461
$this->createMock(IL10N::class),
5562
$this->time,
63+
$this->appConfig,
64+
$this->logger,
5665
);
5766

5867
$this->assertSame([], self::invokePrivate($this->activityManager, 'getConsumers'));
@@ -291,6 +300,101 @@ public function testPublishAllManually(): void {
291300

292301
$this->activityManager->publish($event);
293302
}
303+
304+
public function testPublishWithSuperLongNestedParams(): void {
305+
$this->appConfig->setValueInt('activity', 'overly_long_activities', 0);
306+
$params = [
307+
'level_one' => [
308+
'title' => 'Lorem ipsum dolor sit amet',
309+
'intro' => 'Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur.',
310+
'level_two' => [
311+
[
312+
'heading' => 'Sed ut perspiciatis unde omnis',
313+
'body' => 'Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugit, sed quia consequuntur magni dolores eos qui ratione voluptatem sequi nesciunt.'
314+
],
315+
[
316+
'heading' => 'Neque porro quisquam est',
317+
'body' => 'Neque porro quisquam est, qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velit, sed quia non numquam eius modi tempora incidunt ut labore et dolore magnam aliquam quaerat voluptatem. Ut enim ad minima veniam, quis nostrum exercitationem ullam corporis suscipit laboriosam.'
318+
]
319+
]
320+
],
321+
'level_three' => [
322+
'section_a' => [
323+
'text' => 'At vero eos et accusamus et iusto odio dignissimos ducimus qui blanditiis praesentium voluptatum deleniti atque corrupti quos dolores et quas molestias excepturi sint occaecati cupiditate non provident, similique sunt in culpa qui officia deserunt mollitia animi, id est laborum et dolorum fuga.',
324+
'more_text' => 'Et harum quidem rerum facilis est et expedita distinctio. Nam libero tempore, cum soluta nobis est eligendi optio cumque nihil impedit quo minus id quod maxime placeat facere possimus, omnis voluptas assumenda est, omnis dolor repellendus.'
325+
],
326+
'section_b' => [
327+
'paragraphs' => [
328+
'Temporibus autem quibusdam et aut officiis debitis aut rerum necessitatibus saepe eveniet ut et voluptates repudiandae sint et molestiae non recusandae. Itaque earum rerum hic tenetur a sapiente delectus.',
329+
'Ut aut reiciendis voluptatibus maiores alias consequatur aut perferendis doloribus asperiores repellat. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.',
330+
'Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur.'
331+
]
332+
]
333+
],
334+
'level_four' => [
335+
'deep' => [
336+
'deeper' => [
337+
'block_one' => 'Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam.',
338+
'block_two' => 'Eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugit.',
339+
'block_three' => 'Sed quia consequuntur magni dolores eos qui ratione voluptatem sequi nesciunt. Neque porro quisquam est, qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velit.'
340+
]
341+
]
342+
],
343+
'level_five' => [
344+
'massive_text' => 'Sed quia non numquam eius modi tempora incidunt ut labore et dolore magnam aliquam quaerat voluptatem. Ut enim ad minima veniam, quis nostrum exercitationem ullam corporis suscipit laboriosam, nisi ut aliquid ex ea commodi consequatur? Quis autem vel eum iure reprehenderit qui in ea voluptate velit esse quam nihil molestiae consequatur, vel illum qui dolorem eum fugiat quo voluptas nulla pariatur. At vero eos et accusamus et iusto odio dignissimos ducimus qui blanditiis praesentium voluptatum deleniti atque corrupti quos dolores et quas molestias excepturi sint occaecati cupiditate non provident, similique sunt in culpa qui officia deserunt mollitia animi, id est laborum et dolorum fuga. Et harum quidem rerum facilis est et expedita distinctio. Nam libero tempore, cum soluta nobis est eligendi optio cumque nihil impedit quo minus id quod maxime placeat facere possimus.'
345+
],
346+
'level_six' => [
347+
'repeat_blocks' => [
348+
[
349+
'text' => 'Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.'
350+
],
351+
[
352+
'text' => 'Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollitia animi.'
353+
],
354+
[
355+
'text' => 'Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo.'
356+
]
357+
]
358+
]
359+
];
360+
361+
$event = $event2 = $this->activityManager->generateEvent();
362+
$event->setApp('test_app')
363+
->setType('test_type')
364+
->setAffectedUser('test_affected')
365+
->setAuthor('test_author')
366+
->setTimestamp(1337)
367+
->setSubject('test_subject', $params)
368+
->setMessage('test_message', ['test_message_params'])
369+
->setObject('test_object_type', 42, 'test_object_name')
370+
->setLink('test_link');
371+
372+
$this->assertEquals(1, $this->appConfig->getValueInt('activity', 'overly_long_activities'));
373+
374+
$event2->setApp('test_app')
375+
->setType('test_type')
376+
->setAffectedUser('test_affected')
377+
->setAuthor('test_author')
378+
->setTimestamp(1337)
379+
->setSubject('test_subject', $params)
380+
->setMessage('test_message', ['test_message_params'])
381+
->setObject('test_object_type', 42, 'test_object_name')
382+
->setLink('test_link');
383+
384+
$consumer = $this->getMockBuilder('OCP\Activity\IConsumer')
385+
->disableOriginalConstructor()
386+
->getMock();
387+
$consumer->method('receive');
388+
$this->activityManager->registerConsumer(function () use ($consumer) {
389+
return $consumer;
390+
});
391+
392+
$this->activityManager->publish($event);
393+
$this->activityManager->publish($event2);
394+
$this->assertEquals(2, $this->appConfig->getValueInt('activity', 'overly_long_activities'));
395+
$this->appConfig->setValueInt('activity', 'overly_long_activities', 0);
396+
397+
}
294398
}
295399

296400
class NoOpConsumer implements IConsumer {

0 commit comments

Comments
 (0)