Skip to content

Commit 28a2965

Browse files
authored
Merge pull request #50156 from nextcloud/feat/cardav-example-contact
feat: add example contact on first login
2 parents c85b8aa + 099d9fb commit 28a2965

File tree

132 files changed

+4310
-162
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

132 files changed

+4310
-162
lines changed

.reuse/dep5

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -167,6 +167,10 @@ Files: apps/dav/tests/unit/test_fixtures/caldav-search-limit-timerange-1.ics app
167167
Copyright: 2023 Nextcloud GmbH and Nextcloud contributors
168168
License: AGPL-3.0-or-later
169169

170+
Files: apps/dav/lib/ExampleContentFiles/exampleContact.vcf
171+
Copyright: 2025 Nextcloud GmbH and Nextcloud contributors
172+
License: AGPL-3.0-or-later
173+
170174
Files: composer.json composer.lock .github/CODEOWNERS __tests__/tsconfig.json tsconfig.json build/integration/composer.* vendor-bin/*/composer.json vendor-bin/*/composer.lock apps/*/composer/composer.json apps/*/composer/composer.lock apps/*/composer/composer/installed.json
171175
Copyright: 2011-2016 ownCloud, Inc., 2016-2024 Nextcloud GmbH and Nextcloud contributors
172176
License: AGPL-3.0-only OR AGPL-3.0-or-later

apps/dav/appinfo/info.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,7 @@
7474

7575
<settings>
7676
<admin>OCA\DAV\Settings\CalDAVSettings</admin>
77+
<admin>OCA\DAV\Settings\ExampleContentSettings</admin>
7778
<personal>OCA\DAV\Settings\AvailabilitySettings</personal>
7879
</settings>
7980

apps/dav/appinfo/routes.php

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@
1111
['name' => 'invitation_response#decline', 'url' => '/invitation/decline/{token}', 'verb' => 'GET'],
1212
['name' => 'invitation_response#options', 'url' => '/invitation/moreOptions/{token}', 'verb' => 'GET'],
1313
['name' => 'invitation_response#processMoreOptionsResult', 'url' => '/invitation/moreOptions/{token}', 'verb' => 'POST'],
14+
['name' => 'example_content#setDefaultContact', 'url' => '/api/defaultcontact/contact', 'verb' => 'PUT'],
15+
['name' => 'example_content#setEnableDefaultContact', 'url' => '/api/defaultcontact/config', 'verb' => 'PUT'],
1416
],
1517
'ocs' => [
1618
['name' => 'direct#getUrl', 'url' => '/api/v1/direct', 'verb' => 'POST'],

apps/dav/composer/composer/autoload_classmap.php

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -221,6 +221,7 @@
221221
'OCA\\DAV\\Connector\\Sabre\\ZipFolderPlugin' => $baseDir . '/../lib/Connector/Sabre/ZipFolderPlugin.php',
222222
'OCA\\DAV\\Controller\\BirthdayCalendarController' => $baseDir . '/../lib/Controller/BirthdayCalendarController.php',
223223
'OCA\\DAV\\Controller\\DirectController' => $baseDir . '/../lib/Controller/DirectController.php',
224+
'OCA\\DAV\\Controller\\ExampleContentController' => $baseDir . '/../lib/Controller/ExampleContentController.php',
224225
'OCA\\DAV\\Controller\\InvitationResponseController' => $baseDir . '/../lib/Controller/InvitationResponseController.php',
225226
'OCA\\DAV\\Controller\\OutOfOfficeController' => $baseDir . '/../lib/Controller/OutOfOfficeController.php',
226227
'OCA\\DAV\\Controller\\UpcomingEventsController' => $baseDir . '/../lib/Controller/UpcomingEventsController.php',
@@ -355,9 +356,11 @@
355356
'OCA\\DAV\\Server' => $baseDir . '/../lib/Server.php',
356357
'OCA\\DAV\\ServerFactory' => $baseDir . '/../lib/ServerFactory.php',
357358
'OCA\\DAV\\Service\\AbsenceService' => $baseDir . '/../lib/Service/AbsenceService.php',
359+
'OCA\\DAV\\Service\\DefaultContactService' => $baseDir . '/../lib/Service/DefaultContactService.php',
358360
'OCA\\DAV\\Settings\\Admin\\SystemAddressBookSettings' => $baseDir . '/../lib/Settings/Admin/SystemAddressBookSettings.php',
359361
'OCA\\DAV\\Settings\\AvailabilitySettings' => $baseDir . '/../lib/Settings/AvailabilitySettings.php',
360362
'OCA\\DAV\\Settings\\CalDAVSettings' => $baseDir . '/../lib/Settings/CalDAVSettings.php',
363+
'OCA\\DAV\\Settings\\ExampleContentSettings' => $baseDir . '/../lib/Settings/ExampleContentSettings.php',
361364
'OCA\\DAV\\SetupChecks\\NeedsSystemAddressBookSync' => $baseDir . '/../lib/SetupChecks/NeedsSystemAddressBookSync.php',
362365
'OCA\\DAV\\SetupChecks\\WebdavEndpoint' => $baseDir . '/../lib/SetupChecks/WebdavEndpoint.php',
363366
'OCA\\DAV\\Storage\\PublicOwnerWrapper' => $baseDir . '/../lib/Storage/PublicOwnerWrapper.php',

apps/dav/composer/composer/autoload_static.php

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -236,6 +236,7 @@ class ComposerStaticInitDAV
236236
'OCA\\DAV\\Connector\\Sabre\\ZipFolderPlugin' => __DIR__ . '/..' . '/../lib/Connector/Sabre/ZipFolderPlugin.php',
237237
'OCA\\DAV\\Controller\\BirthdayCalendarController' => __DIR__ . '/..' . '/../lib/Controller/BirthdayCalendarController.php',
238238
'OCA\\DAV\\Controller\\DirectController' => __DIR__ . '/..' . '/../lib/Controller/DirectController.php',
239+
'OCA\\DAV\\Controller\\ExampleContentController' => __DIR__ . '/..' . '/../lib/Controller/ExampleContentController.php',
239240
'OCA\\DAV\\Controller\\InvitationResponseController' => __DIR__ . '/..' . '/../lib/Controller/InvitationResponseController.php',
240241
'OCA\\DAV\\Controller\\OutOfOfficeController' => __DIR__ . '/..' . '/../lib/Controller/OutOfOfficeController.php',
241242
'OCA\\DAV\\Controller\\UpcomingEventsController' => __DIR__ . '/..' . '/../lib/Controller/UpcomingEventsController.php',
@@ -370,9 +371,11 @@ class ComposerStaticInitDAV
370371
'OCA\\DAV\\Server' => __DIR__ . '/..' . '/../lib/Server.php',
371372
'OCA\\DAV\\ServerFactory' => __DIR__ . '/..' . '/../lib/ServerFactory.php',
372373
'OCA\\DAV\\Service\\AbsenceService' => __DIR__ . '/..' . '/../lib/Service/AbsenceService.php',
374+
'OCA\\DAV\\Service\\DefaultContactService' => __DIR__ . '/..' . '/../lib/Service/DefaultContactService.php',
373375
'OCA\\DAV\\Settings\\Admin\\SystemAddressBookSettings' => __DIR__ . '/..' . '/../lib/Settings/Admin/SystemAddressBookSettings.php',
374376
'OCA\\DAV\\Settings\\AvailabilitySettings' => __DIR__ . '/..' . '/../lib/Settings/AvailabilitySettings.php',
375377
'OCA\\DAV\\Settings\\CalDAVSettings' => __DIR__ . '/..' . '/../lib/Settings/CalDAVSettings.php',
378+
'OCA\\DAV\\Settings\\ExampleContentSettings' => __DIR__ . '/..' . '/../lib/Settings/ExampleContentSettings.php',
376379
'OCA\\DAV\\SetupChecks\\NeedsSystemAddressBookSync' => __DIR__ . '/..' . '/../lib/SetupChecks/NeedsSystemAddressBookSync.php',
377380
'OCA\\DAV\\SetupChecks\\WebdavEndpoint' => __DIR__ . '/..' . '/../lib/SetupChecks/WebdavEndpoint.php',
378381
'OCA\\DAV\\Storage\\PublicOwnerWrapper' => __DIR__ . '/..' . '/../lib/Storage/PublicOwnerWrapper.php',
Lines changed: 86 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,86 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
/**
6+
* SPDX-FileCopyrightText: 2025 Nextcloud GmbH and Nextcloud contributors
7+
* SPDX-License-Identifier: AGPL-3.0-or-later
8+
*/
9+
10+
namespace OCA\DAV\Controller;
11+
12+
use OCA\DAV\AppInfo\Application;
13+
use OCP\App\IAppManager;
14+
use OCP\AppFramework\ApiController;
15+
use OCP\AppFramework\Http;
16+
use OCP\AppFramework\Http\JSONResponse;
17+
use OCP\Files\AppData\IAppDataFactory;
18+
use OCP\Files\IAppData;
19+
use OCP\Files\NotFoundException;
20+
use OCP\IConfig;
21+
use OCP\IRequest;
22+
use Psr\Log\LoggerInterface;
23+
24+
class ExampleContentController extends ApiController {
25+
private IAppData $appData;
26+
public function __construct(
27+
IRequest $request,
28+
private IConfig $config,
29+
private IAppDataFactory $appDataFactory,
30+
private IAppManager $appManager,
31+
private LoggerInterface $logger,
32+
) {
33+
parent::__construct(Application::APP_ID, $request);
34+
$this->appData = $this->appDataFactory->get('dav');
35+
}
36+
37+
public function setEnableDefaultContact($allow) {
38+
if ($allow === 'yes' && !$this->defaultContactExists()) {
39+
try {
40+
$this->setCard();
41+
} catch (\Exception $e) {
42+
$this->logger->error('Could not create default contact', ['exception' => $e]);
43+
return new JSONResponse([], Http::STATUS_INTERNAL_SERVER_ERROR);
44+
}
45+
}
46+
$this->config->setAppValue(Application::APP_ID, 'enableDefaultContact', $allow);
47+
return new JSONResponse([], Http::STATUS_OK);
48+
}
49+
50+
public function setDefaultContact(?string $contactData = null) {
51+
if (!$this->config->getAppValue(Application::APP_ID, 'enableDefaultContact', 'no')) {
52+
return new JSONResponse([], Http::STATUS_FORBIDDEN);
53+
}
54+
$this->setCard($contactData);
55+
return new JSONResponse([], Http::STATUS_OK);
56+
}
57+
58+
private function setCard(?string $cardData = null) {
59+
try {
60+
$folder = $this->appData->getFolder('defaultContact');
61+
} catch (NotFoundException $e) {
62+
$folder = $this->appData->newFolder('defaultContact');
63+
}
64+
65+
if (is_null($cardData)) {
66+
$cardData = file_get_contents(__DIR__ . '/../ExampleContentFiles/exampleContact.vcf');
67+
}
68+
69+
if (!$cardData) {
70+
throw new \Exception('Could not read exampleContact.vcf');
71+
}
72+
73+
$file = (!$folder->fileExists('defaultContact.vcf')) ? $folder->newFile('defaultContact.vcf') : $folder->getFile('defaultContact.vcf');
74+
$file->putContent($cardData);
75+
}
76+
77+
private function defaultContactExists(): bool {
78+
try {
79+
$folder = $this->appData->getFolder('defaultContact');
80+
} catch (NotFoundException $e) {
81+
return false;
82+
}
83+
return $folder->fileExists('defaultContact.vcf');
84+
}
85+
86+
}

0 commit comments

Comments
 (0)