aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--apps/files_sharing/lib/Controller/ShareAPIController.php9
-rw-r--r--apps/files_sharing/tests/Controller/ShareAPIControllerTest.php125
-rw-r--r--core/js/sharedialogshareelistview.js19
-rw-r--r--core/js/shareitemmodel.js15
-rw-r--r--core/js/tests/specs/sharedialogviewSpec.js36
-rw-r--r--lib/private/Share20/Share.php40
-rw-r--r--lib/public/Share/IShare.php34
7 files changed, 269 insertions, 9 deletions
diff --git a/apps/files_sharing/lib/Controller/ShareAPIController.php b/apps/files_sharing/lib/Controller/ShareAPIController.php
index 30a8ded2a4a..73c3e5951b0 100644
--- a/apps/files_sharing/lib/Controller/ShareAPIController.php
+++ b/apps/files_sharing/lib/Controller/ShareAPIController.php
@@ -212,8 +212,13 @@ class ShareAPIController extends OCSController {
// "name (type, owner) [id]", depending on the Circles app version.
$hasCircleId = (substr($share->getSharedWith(), -1) === ']');
- $displayNameLength = ($hasCircleId? strrpos($share->getSharedWith(), ' '): strlen($share->getSharedWith()));
- $result['share_with_displayname'] = substr($share->getSharedWith(), 0, $displayNameLength);
+ $result['share_with_displayname'] = $share->getSharedWithDisplayName();
+ if (empty($result['share_with_displayname'])) {
+ $displayNameLength = ($hasCircleId? strrpos($share->getSharedWith(), ' '): strlen($share->getSharedWith()));
+ $result['share_with_displayname'] = substr($share->getSharedWith(), 0, $displayNameLength);
+ }
+
+ $result['share_with_avatar'] = $share->getSharedWithAvatar();
$shareWithStart = ($hasCircleId? strrpos($share->getSharedWith(), '[') + 1: 0);
$shareWithLength = ($hasCircleId? -1: strpos($share->getSharedWith(), ' '));
diff --git a/apps/files_sharing/tests/Controller/ShareAPIControllerTest.php b/apps/files_sharing/tests/Controller/ShareAPIControllerTest.php
index 89a21d7d1e4..c27680ba670 100644
--- a/apps/files_sharing/tests/Controller/ShareAPIControllerTest.php
+++ b/apps/files_sharing/tests/Controller/ShareAPIControllerTest.php
@@ -2074,6 +2074,131 @@ class ShareAPIControllerTest extends TestCase {
], $share, [], false
];
+ // Circle with id, display name and avatar set by the Circles app
+ $share = \OC::$server->getShareManager()->newShare();
+ $share->setShareType(\OCP\Share::SHARE_TYPE_CIRCLE)
+ ->setSharedBy('initiator')
+ ->setSharedWith('Circle (Public circle, circleOwner) [4815162342]')
+ ->setSharedWithDisplayName('The display name')
+ ->setSharedWithAvatar('path/to/the/avatar')
+ ->setShareOwner('owner')
+ ->setPermissions(\OCP\Constants::PERMISSION_READ)
+ ->setNode($folder)
+ ->setShareTime(new \DateTime('2000-01-01T00:01:02'))
+ ->setTarget('myTarget')
+ ->setId(42);
+
+ $result[] = [
+ [
+ 'id' => 42,
+ 'share_type' => \OCP\Share::SHARE_TYPE_CIRCLE,
+ 'uid_owner' => 'initiator',
+ 'displayname_owner' => 'initiator',
+ 'permissions' => 1,
+ 'stime' => 946684862,
+ 'parent' => null,
+ 'expiration' => null,
+ 'token' => null,
+ 'uid_file_owner' => 'owner',
+ 'displayname_file_owner' => 'owner',
+ 'path' => 'folder',
+ 'item_type' => 'folder',
+ 'storage_id' => 'storageId',
+ 'storage' => 100,
+ 'item_source' => 2,
+ 'file_source' => 2,
+ 'file_parent' => 1,
+ 'file_target' => 'myTarget',
+ 'share_with' => '4815162342',
+ 'share_with_displayname' => 'The display name',
+ 'share_with_avatar' => 'path/to/the/avatar',
+ 'mail_send' => 0,
+ 'mimetype' => 'myFolderMimeType',
+ ], $share, [], false
+ ];
+
+ // Circle with id set by the Circles app
+ $share = \OC::$server->getShareManager()->newShare();
+ $share->setShareType(\OCP\Share::SHARE_TYPE_CIRCLE)
+ ->setSharedBy('initiator')
+ ->setSharedWith('Circle (Public circle, circleOwner) [4815162342]')
+ ->setShareOwner('owner')
+ ->setPermissions(\OCP\Constants::PERMISSION_READ)
+ ->setNode($folder)
+ ->setShareTime(new \DateTime('2000-01-01T00:01:02'))
+ ->setTarget('myTarget')
+ ->setId(42);
+
+ $result[] = [
+ [
+ 'id' => 42,
+ 'share_type' => \OCP\Share::SHARE_TYPE_CIRCLE,
+ 'uid_owner' => 'initiator',
+ 'displayname_owner' => 'initiator',
+ 'permissions' => 1,
+ 'stime' => 946684862,
+ 'parent' => null,
+ 'expiration' => null,
+ 'token' => null,
+ 'uid_file_owner' => 'owner',
+ 'displayname_file_owner' => 'owner',
+ 'path' => 'folder',
+ 'item_type' => 'folder',
+ 'storage_id' => 'storageId',
+ 'storage' => 100,
+ 'item_source' => 2,
+ 'file_source' => 2,
+ 'file_parent' => 1,
+ 'file_target' => 'myTarget',
+ 'share_with' => '4815162342',
+ 'share_with_displayname' => 'Circle (Public circle, circleOwner)',
+ 'share_with_avatar' => '',
+ 'mail_send' => 0,
+ 'mimetype' => 'myFolderMimeType',
+ ], $share, [], false
+ ];
+
+ // Circle with id not set by the Circles app
+ $share = \OC::$server->getShareManager()->newShare();
+ $share->setShareType(\OCP\Share::SHARE_TYPE_CIRCLE)
+ ->setSharedBy('initiator')
+ ->setSharedWith('Circle (Public circle, circleOwner)')
+ ->setShareOwner('owner')
+ ->setPermissions(\OCP\Constants::PERMISSION_READ)
+ ->setNode($folder)
+ ->setShareTime(new \DateTime('2000-01-01T00:01:02'))
+ ->setTarget('myTarget')
+ ->setId(42);
+
+ $result[] = [
+ [
+ 'id' => 42,
+ 'share_type' => \OCP\Share::SHARE_TYPE_CIRCLE,
+ 'uid_owner' => 'initiator',
+ 'displayname_owner' => 'initiator',
+ 'permissions' => 1,
+ 'stime' => 946684862,
+ 'parent' => null,
+ 'expiration' => null,
+ 'token' => null,
+ 'uid_file_owner' => 'owner',
+ 'displayname_file_owner' => 'owner',
+ 'path' => 'folder',
+ 'item_type' => 'folder',
+ 'storage_id' => 'storageId',
+ 'storage' => 100,
+ 'item_source' => 2,
+ 'file_source' => 2,
+ 'file_parent' => 1,
+ 'file_target' => 'myTarget',
+ 'share_with' => 'Circle',
+ 'share_with_displayname' => 'Circle (Public circle, circleOwner)',
+ 'share_with_avatar' => '',
+ 'mail_send' => 0,
+ 'mimetype' => 'myFolderMimeType',
+ ], $share, [], false
+ ];
+
$share = \OC::$server->getShareManager()->newShare();
$share->setShareType(\OCP\Share::SHARE_TYPE_USER)
->setSharedBy('initiator')
diff --git a/core/js/sharedialogshareelistview.js b/core/js/sharedialogshareelistview.js
index 1e873a7208e..c8709083c5f 100644
--- a/core/js/sharedialogshareelistview.js
+++ b/core/js/sharedialogshareelistview.js
@@ -25,7 +25,7 @@
'<ul id="shareWithList" class="shareWithList">' +
'{{#each sharees}}' +
'<li data-share-id="{{shareId}}" data-share-type="{{shareType}}" data-share-with="{{shareWith}}">' +
- '<div class="avatar {{#if modSeed}}imageplaceholderseed{{/if}}" data-username="{{shareWith}}" data-displayname="{{shareWithDisplayName}}" {{#if modSeed}}data-seed="{{shareWith}} {{shareType}}"{{/if}}></div>' +
+ '<div class="avatar {{#if modSeed}}imageplaceholderseed{{/if}}" data-username="{{shareWith}}" data-avatar="{{shareWithAvatar}}" data-displayname="{{shareWithDisplayName}}" {{#if modSeed}}data-seed="{{shareWith}} {{shareType}}"{{/if}}></div>' +
'<span class="username" title="{{shareWithTitle}}">{{shareWithDisplayName}}</span>' +
'<span class="sharingOptionsGroup">' +
'{{#if editPermissionPossible}}' +
@@ -188,6 +188,7 @@
getShareeObject: function(shareIndex) {
var shareWith = this.model.getShareWith(shareIndex);
var shareWithDisplayName = this.model.getShareWithDisplayName(shareIndex);
+ var shareWithAvatar = this.model.getShareWithAvatar(shareIndex);
var shareWithTitle = '';
var shareType = this.model.getShareType(shareIndex);
var sharedBy = this.model.getSharedBy(shareIndex);
@@ -211,6 +212,10 @@
shareWithTitle = shareWith + " (" + t('core', 'email') + ')';
} else if (shareType === OC.Share.SHARE_TYPE_CIRCLE) {
shareWithTitle = shareWith;
+ // Force "shareWith" in the template to a safe value, as the
+ // original "shareWith" returned by the model may contain
+ // problematic characters like "'".
+ shareWith = 'circle-' + shareIndex;
}
if (sharedBy !== oc_current_user) {
@@ -238,10 +243,11 @@
hasDeletePermission: this.model.hasDeletePermission(shareIndex),
shareWith: shareWith,
shareWithDisplayName: shareWithDisplayName,
+ shareWithAvatar: shareWithAvatar,
shareWithTitle: shareWithTitle,
shareType: shareType,
shareId: this.model.get('shares')[shareIndex].id,
- modSeed: shareType !== OC.Share.SHARE_TYPE_USER && shareType !== OC.Share.SHARE_TYPE_CIRCLE,
+ modSeed: shareType !== OC.Share.SHARE_TYPE_USER && (shareType !== OC.Share.SHARE_TYPE_CIRCLE || shareWithAvatar),
isRemoteShare: shareType === OC.Share.SHARE_TYPE_REMOTE,
isMailShare: shareType === OC.Share.SHARE_TYPE_EMAIL,
isCircleShare: shareType === OC.Share.SHARE_TYPE_CIRCLE,
@@ -351,9 +357,16 @@
this.$('.avatar').each(function () {
var $this = $(this);
+
if ($this.hasClass('imageplaceholderseed')) {
$this.css({width: 32, height: 32});
- $this.imageplaceholder($this.data('seed'));
+ if ($this.data('avatar')) {
+ $this.css('border-radius', '0%');
+ $this.css('background', 'url(' + $this.data('avatar') + ') no-repeat');
+ $this.css('background-size', '31px');
+ } else {
+ $this.imageplaceholder($this.data('seed'));
+ }
} else {
// user, size, ie8fix, hidedefault, callback, displayname
$this.avatar($this.data('username'), 32, undefined, undefined, undefined, $this.data('displayname'));
diff --git a/core/js/shareitemmodel.js b/core/js/shareitemmodel.js
index e7824aca33a..93feba9c889 100644
--- a/core/js/shareitemmodel.js
+++ b/core/js/shareitemmodel.js
@@ -43,6 +43,7 @@
* @property {string} token
* @property {string} share_with
* @property {string} share_with_displayname
+ * @property {string} share_with_avatar
* @property {string} mail_send
* @property {Date} expiration optional?
* @property {number} stime optional?
@@ -405,6 +406,20 @@
return share.share_with_displayname;
},
+
+ /**
+ * @param shareIndex
+ * @returns {string}
+ */
+ getShareWithAvatar: function(shareIndex) {
+ /** @type OC.Share.Types.ShareInfo **/
+ var share = this.get('shares')[shareIndex];
+ if(!_.isObject(share)) {
+ throw "Unknown Share";
+ }
+ return share.share_with_avatar;
+ },
+
/**
* @param shareIndex
* @returns {string}
diff --git a/core/js/tests/specs/sharedialogviewSpec.js b/core/js/tests/specs/sharedialogviewSpec.js
index d3639159849..265bfbca973 100644
--- a/core/js/tests/specs/sharedialogviewSpec.js
+++ b/core/js/tests/specs/sharedialogviewSpec.js
@@ -427,7 +427,21 @@ describe('OC.Share.ShareDialogView', function() {
share_type: OC.Share.SHARE_TYPE_REMOTE,
share_with: 'foo@bar.com/baz',
share_with_displayname: 'foo@bar.com/baz'
-
+ },{
+ id: 103,
+ item_source: 123,
+ permissions: 31,
+ share_type: OC.Share.SHARE_TYPE_CIRCLE,
+ share_with: 'circle-0',
+ share_with_displayname: 'Circle (Personal circle, user0)',
+ share_with_avatar: 'path/to/the/avatar'
+ },{
+ id: 104,
+ item_source: 123,
+ permissions: 31,
+ share_type: OC.Share.SHARE_TYPE_CIRCLE,
+ share_with: 'circle-1',
+ share_with_displayname: 'Circle (Public circle, user0)',
}]
});
});
@@ -439,10 +453,10 @@ describe('OC.Share.ShareDialogView', function() {
});
it('test correct function calls', function() {
- expect(avatarStub.calledTwice).toEqual(true);
+ expect(avatarStub.calledThrice).toEqual(true);
expect(placeholderStub.callCount).toEqual(4);
- expect(dialog.$('.shareWithList').children().length).toEqual(3);
- expect(dialog.$('.avatar').length).toEqual(4);
+ expect(dialog.$('.shareWithList').children().length).toEqual(5);
+ expect(dialog.$('.avatar').length).toEqual(6);
});
it('test avatar owner', function() {
@@ -469,6 +483,20 @@ describe('OC.Share.ShareDialogView', function() {
expect(args.length).toEqual(1);
expect(args[0]).toEqual('foo@bar.com/baz ' + OC.Share.SHARE_TYPE_REMOTE);
});
+
+ it('test avatar for circle', function() {
+ var avatarElement = dialog.$('.avatar').eq(4);
+ expect(avatarElement.css('background')).toContain('path/to/the/avatar');
+ });
+
+ it('test avatar for circle without avatar', function() {
+ var args = avatarStub.getCall(2).args;
+ expect(args.length).toEqual(6);
+ // Note that "data-username" is set to "circle-{shareIndex}",
+ // not to the "shareWith" field.
+ expect(args[0]).toEqual('circle-4');
+ expect(args[5]).toEqual('Circle (Public circle, user0)');
+ });
});
});
describe('get suggestions', function() {
diff --git a/lib/private/Share20/Share.php b/lib/private/Share20/Share.php
index 1836d6708c5..d7810165dac 100644
--- a/lib/private/Share20/Share.php
+++ b/lib/private/Share20/Share.php
@@ -48,6 +48,10 @@ class Share implements \OCP\Share\IShare {
/** @var string */
private $sharedWith;
/** @var string */
+ private $sharedWithDisplayName;
+ /** @var string */
+ private $sharedWithAvatar;
+ /** @var string */
private $sharedBy;
/** @var string */
private $shareOwner;
@@ -254,6 +258,42 @@ class Share implements \OCP\Share\IShare {
/**
* @inheritdoc
*/
+ public function setSharedWithDisplayName($displayName) {
+ if (!is_string($displayName)) {
+ throw new \InvalidArgumentException();
+ }
+ $this->sharedWithDisplayName = $displayName;
+ return $this;
+ }
+
+ /**
+ * @inheritdoc
+ */
+ public function getSharedWithDisplayName() {
+ return $this->sharedWithDisplayName;
+ }
+
+ /**
+ * @inheritdoc
+ */
+ public function setSharedWithAvatar($src) {
+ if (!is_string($src)) {
+ throw new \InvalidArgumentException();
+ }
+ $this->sharedWithAvatar = $src;
+ return $this;
+ }
+
+ /**
+ * @inheritdoc
+ */
+ public function getSharedWithAvatar() {
+ return $this->sharedWithAvatar;
+ }
+
+ /**
+ * @inheritdoc
+ */
public function setPermissions($permissions) {
//TODO checkes
diff --git a/lib/public/Share/IShare.php b/lib/public/Share/IShare.php
index c19364c86c8..870794d6536 100644
--- a/lib/public/Share/IShare.php
+++ b/lib/public/Share/IShare.php
@@ -170,6 +170,40 @@ interface IShare {
public function getSharedWith();
/**
+ * Set the display name of the receiver of this share.
+ *
+ * @param string $displayName
+ * @return \OCP\Share\IShare The modified object
+ * @since 14.0.0
+ */
+ public function setSharedWithDisplayName($displayName);
+
+ /**
+ * Get the display name of the receiver of this share.
+ *
+ * @return string
+ * @since 14.0.0
+ */
+ public function getSharedWithDisplayName();
+
+ /**
+ * Set the avatar of the receiver of this share.
+ *
+ * @param string $src
+ * @return \OCP\Share\IShare The modified object
+ * @since 14.0.0
+ */
+ public function setSharedWithAvatar($src);
+
+ /**
+ * Get the avatar of the receiver of this share.
+ *
+ * @return string
+ * @since 14.0.0
+ */
+ public function getSharedWithAvatar();
+
+ /**
* Set the permissions.
* See \OCP\Constants::PERMISSION_*
*