]> source.dussan.org Git - nextcloud-server.git/commitdiff
add activity if a file was shared by mail
authorBjoern Schiessle <bjoern@schiessle.org>
Mon, 7 Nov 2016 14:08:56 +0000 (15:08 +0100)
committerBjoern Schiessle <bjoern@schiessle.org>
Tue, 8 Nov 2016 14:58:52 +0000 (15:58 +0100)
Signed-off-by: Bjoern Schiessle <bjoern@schiessle.org>
apps/files_sharing/lib/Activity.php
apps/sharebymail/appinfo/app.php
apps/sharebymail/lib/Activity.php [new file with mode: 0644]
apps/sharebymail/lib/ShareByMailProvider.php
apps/sharebymail/tests/ActivityTest.php [new file with mode: 0644]
apps/sharebymail/tests/ShareByMailProviderTest.php
lib/private/Share20/ProviderFactory.php

index a5aabab9acd68417136188956f770e733ad1ba95..596043765bb44ff9184a3adea11b4a28dfa92df5 100644 (file)
@@ -72,7 +72,6 @@ class Activity implements IExtension {
        const SUBJECT_LINK_EXPIRED = 'link_expired';
        const SUBJECT_LINK_BY_EXPIRED = 'link_by_expired';
 
-       const SUBJECT_SHARED_EMAIL = 'shared_with_email';
        const SUBJECT_SHARED_FILE_BY_EMAIL_DOWNLOADED = 'file_shared_with_email_downloaded';
        const SUBJECT_SHARED_FOLDER_BY_EMAIL_DOWNLOADED = 'folder_shared_with_email_downloaded';
 
@@ -250,8 +249,6 @@ class Activity implements IExtension {
                        case self::SUBJECT_UNSHARED_BY:
                                return (string) $l->t('%2$s removed the share for %1$s', $params);
 
-                       case self::SUBJECT_SHARED_EMAIL:
-                               return (string) $l->t('You shared %1$s with %2$s', $params);
                        case self::SUBJECT_SHARED_FILE_BY_EMAIL_DOWNLOADED:
                                return (string) $l->t('File %1$s shared by email with %2$s was downloaded', $params);
                        case self::SUBJECT_SHARED_FOLDER_BY_EMAIL_DOWNLOADED:
@@ -307,8 +304,6 @@ class Activity implements IExtension {
                        case self::SUBJECT_SHARED_WITH_BY:
                                return (string) $l->t('Shared by %2$s', $params);
 
-                       case self::SUBJECT_SHARED_EMAIL:
-                               return (string) $l->t('Shared with %2$s', $params);
                        case self::SUBJECT_SHARED_FILE_BY_EMAIL_DOWNLOADED:
                        case self::SUBJECT_SHARED_FOLDER_BY_EMAIL_DOWNLOADED:
                                return (string) $l->t('Downloaded by %2$s', $params);
index 5ef7b6f18cb2827284c5663c1d00ce2de766da43..0723b2dcc5fa7ed55b185f853bb9c0fcdfae8b7b 100644 (file)
 $settings = new \OCA\ShareByMail\Settings();
 
 \OCP\Util::connectHook('\OCP\Config', 'js', $settings, 'announceShareProvider');
+
+\OC::$server->getActivityManager()->registerExtension(function() {
+       return new \OCA\ShareByMail\Activity(
+               \OC::$server->query('L10NFactory'),
+               \OC::$server->getActivityManager()
+       );
+});
diff --git a/apps/sharebymail/lib/Activity.php b/apps/sharebymail/lib/Activity.php
new file mode 100644 (file)
index 0000000..75b1f5d
--- /dev/null
@@ -0,0 +1,269 @@
+<?php
+/**
+ * @copyright Copyright (c) 2016 Bjoern Schiessle <bjoern@schiessle.org>
+ *
+ * @license GNU AGPL version 3 or any later version
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation, either version 3 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+
+namespace OCA\ShareByMail;
+
+
+use OCP\Activity\IExtension;
+use OCP\Activity\IManager;
+use OCP\IL10N;
+use OCP\L10N\IFactory;
+
+class Activity implements IExtension {
+
+       const SHARE_BY_MAIL_APP = 'sharebymail';
+
+       const SUBJECT_SHARED_EMAIL_SELF = 'shared_with_email_self';
+       const SUBJECT_SHARED_EMAIL_BY = 'shared_with_email_by';
+
+       /** @var IFactory */
+       private $languageFactory;
+
+       /** @var IManager */
+       private $activityManager;
+
+       /**
+        * @param IFactory $languageFactory
+        * @param IManager $activityManager
+        */
+       public function __construct(IFactory $languageFactory, IManager $activityManager) {
+               $this->languageFactory = $languageFactory;
+               $this->activityManager = $activityManager;
+       }
+
+       /**
+        * The extension can return an array of additional notification types.
+        * If no additional types are to be added false is to be returned
+        *
+        * @param string $languageCode
+        * @return array|false Array "stringID of the type" => "translated string description for the setting"
+        *                or Array "stringID of the type" => [
+        *                    'desc' => "translated string description for the setting"
+        *                    'methods' => [self::METHOD_*],
+        *                ]
+        * @since 8.0.0 - 8.2.0: Added support to allow limiting notifications to certain methods
+        */
+       public function getNotificationTypes($languageCode) {
+               return false;
+       }
+
+       /**
+        * For a given method additional types to be displayed in the settings can be returned.
+        * In case no additional types are to be added false is to be returned.
+        *
+        * @param string $method
+        * @return array|false
+        * @since 8.0.0
+        */
+       public function getDefaultTypes($method) {
+               return false;
+       }
+
+       /**
+        * A string naming the css class for the icon to be used can be returned.
+        * If no icon is known for the given type false is to be returned.
+        *
+        * @param string $type
+        * @return string|false
+        * @since 8.0.0
+        */
+       public function getTypeIcon($type) {
+               return false;
+       }
+
+       /**
+        * The extension can translate a given message to the requested languages.
+        * If no translation is available false is to be returned.
+        *
+        * @param string $app
+        * @param string $text
+        * @param array $params
+        * @param boolean $stripPath
+        * @param boolean $highlightParams
+        * @param string $languageCode
+        * @return string|false
+        * @since 8.0.0
+        */
+       public function translate($app, $text, $params, $stripPath, $highlightParams, $languageCode) {
+               if ($app !== self::SHARE_BY_MAIL_APP) {
+                       return false;
+               }
+
+               $l = $this->getL10N($languageCode);
+
+               if ($this->activityManager->isFormattingFilteredObject()) {
+                       $translation = $this->translateShort($text, $l, $params);
+                       if ($translation !== false) {
+                               return $translation;
+                       }
+               }
+
+               return $this->translateLong($text, $l, $params);
+       }
+
+
+       /**
+        * The extension can define the type of parameters for translation
+        *
+        * Currently known types are:
+        * * file        => will strip away the path of the file and add a tooltip with it
+        * * username    => will add the avatar of the user
+        *
+        * @param string $app
+        * @param string $text
+        * @return array|false
+        * @since 8.0.0
+        */
+       public function getSpecialParameterList($app, $text) {
+               if ($app === self::SHARE_BY_MAIL_APP) {
+                       switch ($text) {
+                               case self::SUBJECT_SHARED_EMAIL_BY:
+                                       return [
+                                               0 => 'file',
+                                               1 => 'email',
+                                               2 => 'user',
+                                       ];
+                               case self::SUBJECT_SHARED_EMAIL_SELF:
+                                       return [
+                                               0 => 'file',
+                                               1 => 'email',
+                                       ];
+                       }
+               }
+
+               return false;
+       }
+
+       /**
+        * The extension can define the parameter grouping by returning the index as integer.
+        * In case no grouping is required false is to be returned.
+        *
+        * @param array $activity
+        * @return integer|false
+        * @since 8.0.0
+        */
+       public function getGroupParameter($activity) {
+               if ($activity['app'] === self::SHARE_BY_MAIL_APP) {
+                       switch ($activity['subject']) {
+                               case self::SUBJECT_SHARED_EMAIL_BY:
+                                       // Group by file name
+                                       return 0;
+                               case self::SUBJECT_SHARED_EMAIL_SELF:
+                                       // Group by user/group
+                                       return 1;
+                       }
+               }
+
+               return false;
+
+       }
+
+       /**
+        * The extension can define additional navigation entries. The array returned has to contain two keys 'top'
+        * and 'apps' which hold arrays with the relevant entries.
+        * If no further entries are to be added false is no be returned.
+        *
+        * @return array|false
+        * @since 8.0.0
+        */
+       public function getNavigation() {
+               return false;
+       }
+
+       /**
+        * The extension can check if a customer filter (given by a query string like filter=abc) is valid or not.
+        *
+        * @param string $filterValue
+        * @return boolean
+        * @since 8.0.0
+        */
+       public function isFilterValid($filterValue) {
+               return false;
+       }
+
+       /**
+        * The extension can filter the types based on the filter if required.
+        * In case no filter is to be applied false is to be returned unchanged.
+        *
+        * @param array $types
+        * @param string $filter
+        * @return array|false
+        * @since 8.0.0
+        */
+       public function filterNotificationTypes($types, $filter) {
+               return false;
+       }
+
+       /**
+        * For a given filter the extension can specify the sql query conditions including parameters for that query.
+        * In case the extension does not know the filter false is to be returned.
+        * The query condition and the parameters are to be returned as array with two elements.
+        * E.g. return array('`app` = ? and `message` like ?', array('mail', 'ownCloud%'));
+        *
+        * @param string $filter
+        * @return array|false
+        * @since 8.0.0
+        */
+       public function getQueryForFilter($filter) {
+               return false;
+       }
+
+       protected function getL10N($languageCode = null) {
+               return $this->languageFactory->get(self::SHARE_BY_MAIL_APP, $languageCode);
+       }
+
+       /**
+        * @param string $text
+        * @param IL10N $l
+        * @param array $params
+        * @return bool|string
+        */
+       protected function translateLong($text, IL10N $l, array $params) {
+
+               switch ($text) {
+                       case self::SUBJECT_SHARED_EMAIL_SELF:
+                               return (string) $l->t('You shared %1$s with %2$s by mail', $params);
+                       case self::SUBJECT_SHARED_EMAIL_BY:
+                               return (string) $l->t('%3$s shared %1$s with %2$s by mail', $params);
+               }
+
+               return false;
+       }
+
+       /**
+        * @param string $text
+        * @param IL10N $l
+        * @param array $params
+        * @return bool|string
+        */
+       protected function translateShort($text, IL10N $l, array $params) {
+               switch ($text) {
+                       case self::SUBJECT_SHARED_EMAIL_SELF:
+                               return (string) $l->t('Shared with %2$s', $params);
+                       case self::SUBJECT_SHARED_EMAIL_BY:
+                               return (string) $l->t('Shared with %3$s by %2ks', $params);
+               }
+
+               return false;
+       }
+
+}
index e084ce3288f6907abb97610398ca1c18093f6ccf..cb013acd4de46deb4268259dfd1881fd1bd1d3a8 100644 (file)
@@ -23,6 +23,7 @@ namespace OCA\ShareByMail;
 
 use OC\HintException;
 use OC\Share20\Exception\InvalidShare;
+use OCP\Activity\IManager;
 use OCP\Files\Folder;
 use OCP\Files\IRootFolder;
 use OCP\Files\Node;
@@ -70,6 +71,9 @@ class ShareByMailProvider implements IShareProvider {
        /** @var IURLGenerator */
        private $urlGenerator;
 
+       /** @var IManager  */
+       private $activityManager;
+
        /**
         * Return the identifier of this provider.
         *
@@ -90,6 +94,7 @@ class ShareByMailProvider implements IShareProvider {
         * @param ILogger $logger
         * @param IMailer $mailer
         * @param IURLGenerator $urlGenerator
+        * @param IManager $activityManager
         */
        public function __construct(
                IDBConnection $connection,
@@ -99,7 +104,8 @@ class ShareByMailProvider implements IShareProvider {
                IL10N $l,
                ILogger $logger,
                IMailer $mailer,
-               IURLGenerator $urlGenerator
+               IURLGenerator $urlGenerator,
+               IManager $activityManager
        ) {
                $this->dbConnection = $connection;
                $this->secureRandom = $secureRandom;
@@ -109,6 +115,7 @@ class ShareByMailProvider implements IShareProvider {
                $this->logger = $logger;
                $this->mailer = $mailer;
                $this->urlGenerator = $urlGenerator;
+               $this->activityManager = $activityManager;
        }
 
        /**
@@ -134,12 +141,65 @@ class ShareByMailProvider implements IShareProvider {
                }
 
                $shareId = $this->createMailShare($share);
-
+               $this->createActivity($share);
                $data = $this->getRawShare($shareId);
                return $this->createShareObject($data);
 
        }
 
+       /**
+        * create activity if a file/folder was shared by mail
+        *
+        * @param IShare $share
+        */
+       protected function createActivity(IShare $share) {
+
+               $userFolder = $this->rootFolder->getUserFolder($share->getSharedBy());
+
+               $this->publishActivity(
+                       Activity::SUBJECT_SHARED_EMAIL_SELF,
+                       [$userFolder->getRelativePath($share->getNode()->getPath()), $share->getSharedWith()],
+                       $share->getSharedBy(),
+                       $share->getNode()->getId(),
+                       $userFolder->getRelativePath($share->getNode()->getPath())
+               );
+
+               if ($share->getShareOwner() !== $share->getSharedBy()) {
+                       $ownerFolder = $this->rootFolder->getUserFolder($share->getShareOwner());
+                       $fileId = $share->getNode()->getId();
+                       $node = $ownerFolder->getById($fileId);
+                       $ownerPath = $node[0]->getPath();
+                       $this->publishActivity(
+                               Activity::SUBJECT_SHARED_EMAIL_BY,
+                               [$ownerFolder->getRelativePath($ownerPath), $share->getSharedWith(), $share->getSharedBy()],
+                               $share->getShareOwner(),
+                               $fileId,
+                               $userFolder->getRelativePath($ownerPath)
+                       );
+               }
+
+       }
+
+       /**
+        * publish activity if a file/folder was shared by mail
+        *
+        * @param $subject
+        * @param $parameters
+        * @param $affectedUser
+        * @param $fileId
+        * @param $filePath
+        */
+       protected function publishActivity($subject, $parameters, $affectedUser, $fileId, $filePath) {
+               $event = $this->activityManager->generateEvent();
+               $event->setApp('sharebymail')
+                       ->setType('shared')
+                       ->setSubject($subject, $parameters)
+                       ->setAffectedUser($affectedUser)
+                       ->setObject('files', $fileId, $filePath);
+               $this->activityManager->publish($event);
+
+       }
+
        /**
         * @param IShare $share
         * @return int
diff --git a/apps/sharebymail/tests/ActivityTest.php b/apps/sharebymail/tests/ActivityTest.php
new file mode 100644 (file)
index 0000000..9bc8c82
--- /dev/null
@@ -0,0 +1,68 @@
+<?php
+/**
+ * @copyright Copyright (c) 2016 Bjoern Schiessle <bjoern@schiessle.org>
+ *
+ * @license GNU AGPL version 3 or any later version
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation, either version 3 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+
+namespace OCA\ShareByMail\Tests;
+
+
+use OCA\ShareByMail\Activity;
+
+class ActivityTest extends \Test\TestCase   {
+
+       /**
+        * @var \OCA\ShareByMail\Activity
+        */
+       private $activity;
+
+       protected function setUp() {
+               parent::setUp();
+               $this->activity = new Activity(
+                       $this->getMockBuilder('OCP\L10N\IFactory')
+                               ->disableOriginalConstructor()
+                               ->getMock(),
+                       $this->getMockBuilder('OCP\Activity\IManager')
+                               ->disableOriginalConstructor()
+                               ->getMock()
+               );
+       }
+
+       /**
+        * @dataProvider dataTestGetSpecialParameterList
+        *
+        */
+       public function testGetSpecialParameterList($app, $text, $expected) {
+               $result = $this->activity->getSpecialParameterList($app, $text);
+               $this->assertSame($expected, $result);
+       }
+
+       public function dataTestGetSpecialParameterList() {
+               return [
+                       ['sharebymail', Activity::SUBJECT_SHARED_EMAIL_SELF, [0 => 'file', 1 => 'email']],
+                       ['sharebymail', Activity::SUBJECT_SHARED_EMAIL_BY, [0 => 'file', 1 => 'email', 2 => 'user']],
+                       ['sharebymail', 'unknown', false],
+                       ['randomApp', Activity::SUBJECT_SHARED_EMAIL_SELF, false],
+                       ['randomApp', Activity::SUBJECT_SHARED_EMAIL_BY, false],
+
+               ];
+       }
+
+}
+
index eedce286a0360017f9bd34f3d2cf8f0ec5a294c4..65eded3eb7d751e9b3e6fb25aae996fe15368e86 100644 (file)
@@ -76,6 +76,9 @@ class ShareByMailProviderTest extends TestCase {
        /** @var  IShare | \PHPUnit_Framework_MockObject_MockObject */
        private $share;
 
+       /** @var  \OCP\Activity\IManager | \PHPUnit_Framework_MockObject_MockObject */
+       private $activityManager;
+
        public function setUp() {
                parent::setUp();
 
@@ -94,6 +97,7 @@ class ShareByMailProviderTest extends TestCase {
                $this->mailer = $this->getMockBuilder('\OCP\Mail\IMailer')->getMock();
                $this->urlGenerator = $this->getMockBuilder('\OCP\IUrlGenerator')->getMock();
                $this->share = $this->getMockBuilder('\OCP\Share\IShare')->getMock();
+               $this->activityManager = $this->getMockBuilder('OCP\Activity\IManager')->getMock();
 
                $this->userManager->expects($this->any())->method('userExists')->willReturn(true);
        }
@@ -116,7 +120,8 @@ class ShareByMailProviderTest extends TestCase {
                                        $this->l,
                                        $this->logger,
                                        $this->mailer,
-                                       $this->urlGenerator
+                                       $this->urlGenerator,
+                                       $this->activityManager
                                ]
                        );
 
@@ -133,7 +138,8 @@ class ShareByMailProviderTest extends TestCase {
                        $this->l,
                        $this->logger,
                        $this->mailer,
-                       $this->urlGenerator
+                       $this->urlGenerator,
+                       $this->activityManager
                );
 
        }
@@ -148,10 +154,11 @@ class ShareByMailProviderTest extends TestCase {
                $share = $this->getMockBuilder('\OCP\Share\IShare')->getMock();
                $share->expects($this->once())->method('getSharedWith')->willReturn('user1');
 
-               $instance = $this->getInstance(['getSharedWith', 'createMailShare', 'getRawShare', 'createShareObject']);
+               $instance = $this->getInstance(['getSharedWith', 'createMailShare', 'getRawShare', 'createShareObject', 'createActivity']);
 
                $instance->expects($this->once())->method('getSharedWith')->willReturn([]);
                $instance->expects($this->once())->method('createMailShare')->with($share)->willReturn(42);
+               $instance->expects($this->once())->method('createActivity')->with($share);
                $instance->expects($this->once())->method('getRawShare')->with(42)->willReturn('rawShare');
                $instance->expects($this->once())->method('createShareObject')->with('rawShare')->willReturn('shareObject');
 
@@ -614,7 +621,7 @@ class ShareByMailProviderTest extends TestCase {
                $userManager = \OC::$server->getUserManager();
                $rootFolder = \OC::$server->getRootFolder();
 
-               $provider = $this->getInstance(['sendMailNotification']);
+               $provider = $this->getInstance(['sendMailNotification', 'createActivity']);
 
                $u1 = $userManager->createUser('testFed', md5(time()));
                $u2 = $userManager->createUser('testFed2', md5(time()));
@@ -651,5 +658,5 @@ class ShareByMailProviderTest extends TestCase {
                $u1->delete();
                $u2->delete();
        }
-       
+
 }
index 457cf117c6994e6278b44d387aaea3bde4bcebb4..fe9dc0cdfb29eac2f4e9462d094e1881e0688ac7 100644 (file)
@@ -153,7 +153,8 @@ class ProviderFactory implements IProviderFactory {
                                $l,
                                $this->serverContainer->getLogger(),
                                $this->serverContainer->getMailer(),
-                               $this->serverContainer->getURLGenerator()
+                               $this->serverContainer->getURLGenerator(),
+                               $this->serverContainer->getActivityManager()
                        );
                }