Add activity support for sharing

This commit is contained in:
brantje 2016-10-05 13:46:25 +02:00
parent 13197c583c
commit 35d6d3777c
No known key found for this signature in database
GPG key ID: 5FF1D117F918687F
6 changed files with 114 additions and 29 deletions

View file

@ -11,6 +11,7 @@
namespace OCA\Passman\Controller;
use OCA\Files_External\NotFoundException;
use OCA\Passman\Db\SharingACL;
use OCP\AppFramework\Http;
use OCP\AppFramework\Http\DataResponse;
@ -28,7 +29,7 @@ class CredentialController extends ApiController {
private $credentialService;
private $activityService;
private $credentialRevisionService;
private $sharingService;
private $sharingService;
public function __construct($AppName,
IRequest $request,
@ -36,14 +37,14 @@ class CredentialController extends ApiController {
CredentialService $credentialService,
ActivityService $activityService,
CredentialRevisionService $credentialRevisionService,
ShareService $sharingService
) {
ShareService $sharingService
) {
parent::__construct($AppName, $request);
$this->userId = $UserId;
$this->credentialService = $credentialService;
$this->activityService = $activityService;
$this->credentialRevisionService = $credentialRevisionService;
$this->sharingService = $sharingService;
$this->sharingService = $sharingService;
}
/**
@ -80,10 +81,12 @@ class CredentialController extends ApiController {
);
$credential = $this->credentialService->createCredential($credential);
$link = ''; // @TODO create direct link to credential
$this->activityService->add(
Activity::SUBJECT_ITEM_CREATED_SELF, array($label, $this->userId),
'', array(),
$link, $this->userId, Activity::TYPE_ITEM_ACTION);
if(!$credential->getHidden()) {
$this->activityService->add(
Activity::SUBJECT_ITEM_CREATED_SELF, array($label, $this->userId),
'', array(),
$link, $this->userId, Activity::TYPE_ITEM_ACTION);
}
return new JSONResponse($credential);
}
@ -127,48 +130,92 @@ class CredentialController extends ApiController {
'delete_time' => $delete_time,
'hidden' => $hidden,
'otp' => $otp,
'shared_key' => ($shared_key === NULL) ? '' : $shared_key,
'shared_key' => ($shared_key === null) ? '' : $shared_key,
);
if ($storedCredential->getUserId() !== $this->userId){
$acl = $this->sharingService->getCredentialAclForUser($this->userId, $storedCredential->getGuid());
if ($acl->hasPermission(SharingACL::WRITE)) {
$credential['shared_key'] = $storedCredential->getSharedKey();
}
else {
return new DataResponse(['msg' => 'Not authorized'], Http::STATUS_UNAUTHORIZED);
}
}
if ($storedCredential->getUserId() !== $this->userId) {
$acl = $this->sharingService->getCredentialAclForUser($this->userId, $storedCredential->getGuid());
if ($acl->hasPermission(SharingACL::WRITE)) {
$credential['shared_key'] = $storedCredential->getSharedKey();
} else {
return new DataResponse(['msg' => 'Not authorized'], Http::STATUS_UNAUTHORIZED);
}
}
//@TODO Add activities for non owned items
$link = ''; // @TODO create direct link to credential
$activity = false;
if ($revision_created) {
$activity = 'item_apply_revision';
$this->activityService->add(
'item_apply_revision_self', array($label, $this->userId, $revision_created),
$activity . '_self', array($label, $this->userId, $revision_created),
'', array(),
$link, $this->userId, Activity::TYPE_ITEM_ACTION);
} else if (($storedCredential->getDeleteTime() == 0) && $delete_time > 0) {
$activity = 'item_deleted';
$this->activityService->add(
'item_deleted_self', array($label, $this->userId),
$activity . '_self', array($label, $this->userId),
'', array(),
$link, $this->userId, Activity::TYPE_ITEM_ACTION);
} else if (($storedCredential->getDeleteTime() > 0) && $delete_time == 0) {
$activity = 'item_recovered';
$this->activityService->add(
'item_recovered_self', array($label, $this->userId),
$activity . '_self', array($label, $this->userId),
'', array(),
$link, $this->userId, Activity::TYPE_ITEM_ACTION);
} else if ($label != $storedCredential->getLabel()) {
$activity = 'item_renamed';
$this->activityService->add(
'item_renamed_self', array($storedCredential->getLabel(), $label, $this->userId),
$activity . '_self', array($storedCredential->getLabel(), $label, $this->userId),
'', array(),
$link, $this->userId, Activity::TYPE_ITEM_RENAMED);
} else {
$activity = 'item_edited';
$this->activityService->add(
'item_edited_self', array($label, $this->userId),
$activity . '_self', array($label, $this->userId),
'', array(),
$link, $this->userId, Activity::TYPE_ITEM_ACTION);
}
$acl_list = null;
try {
$acl_list = $this->sharingService->getCredentialAclList($storedCredential->getGuid());
} catch (DoesNotExistException $exception) {
}
if ($acl_list) {
$params = array();
switch ($activity) {
case 'item_recovered':
case 'item_deleted':
case 'item_edited':
$params = array($credential['label'], $this->userId);
break;
case 'item_apply_revision':
$params = array($credential['label'], $this->userId, $revision_created);
break;
case 'item_renamed':
$params = array($storedCredential->getLabel(), $label, $this->userId);
break;
}
foreach ($acl_list as $sharingACL) {
$target_user = $sharingACL->getUserId();
if($target_user == $this->userId){
continue;
}
$this->activityService->add(
$activity, $params,
'', array(),
$link, $target_user, Activity::TYPE_ITEM_ACTION);
}
if ($this->userId != $storedCredential->getUserId()) {
$this->activityService->add(
$activity, $params,
'', array(),
$link, $storedCredential->getUserId(), Activity::TYPE_ITEM_ACTION);
}
}
$this->credentialRevisionService->createRevision($storedCredential, $storedCredential->getUserId(), $credential_id, $this->userId);
$credential = $this->credentialService->updateCredential($credential);

View file

@ -79,6 +79,12 @@ class ShareController extends ApiController {
*/
public function createPublicShare($item_id, $item_guid, $permissions, $expire_timestamp, $expire_views) {
try{
$credential = $this->credentialService->getCredentialByGUID($item_guid);
} catch (DoesNotExistException $exception){
return new NotFoundResponse();
}
try {
$acl = $this->shareService->getACL(null, $item_guid);
} catch (DoesNotExistException $exception) {
@ -93,6 +99,11 @@ class ShareController extends ApiController {
$acl->setExpireViews($expire_views);
if (!$acl->getId()) {
$this->shareService->createACLEntry($acl);
$this->activityService->add(
'item_shared_publicly', [$credential->getLabel()],
'', array(),
'', $this->userId->getUID(), Activity::TYPE_ITEM_SHARED);
} else {
$this->shareService->updateCredentialACL($acl);
}
@ -113,7 +124,7 @@ class ShareController extends ApiController {
$first_vault = $vaults[0];
try {
$shareRequests = $this->shareService->getPendingShareRequests($item_guid, $first_vault['user_id']);
$shareRequests = $this->shareService->getPendingShareRequestsForCredential($item_guid, $first_vault['user_id']);
if (count($shareRequests) > 0) {
return new JSONResponse(array('error' => 'User got already pending requests'));
}
@ -150,9 +161,22 @@ class ShareController extends ApiController {
$notification
);
array_push($processed_users, $target_user);
$this->activityService->add(
'item_shared', [$credential->getLabel(), $target_user],
'', array(),
'', $this->userId->getUID(), Activity::TYPE_ITEM_SHARED);
$this->activityService->add(
'item_share_received', [$credential->getLabel(), $this->userId->getUID()],
'', array(),
'', $target_user, Activity::TYPE_ITEM_SHARED);
}
}
}
return new JSONResponse($result);
}

View file

@ -157,7 +157,7 @@ angular.module('passmanApp')
$scope.setPermission = function(acl, permission){
acl.togglePermission(permission);
};
console.log($scope.storedCredential)
$scope.shareWith = function (shareWith, selectedAccessLevel) {
//@TODO Improve this so we can add, edit and remove users and permissions.
$scope.inputSharedWith = [];
@ -169,7 +169,7 @@ angular.module('passmanApp')
type: shareWith[i].type,
acl: angular.copy($scope.default_permissions),
pending: true,
credential_guid: $scope.selectedCredential.guid
credential_guid: $scope.storedCredential.guid
};
if ($scope.share_settings.credentialSharedWithUserAndGroup.indexOf(obj) === -1) {
$scope.share_settings.credentialSharedWithUserAndGroup.push(obj)

View file

@ -30,6 +30,8 @@ class Activity implements \OCP\Activity\IExtension {
const SUBJECT_ITEM_DESTROYED_SELF = 'item_destroyed_self';
const SUBJECT_ITEM_EXPIRED = 'item_expired';
const SUBJECT_ITEM_SHARED = 'item_shared';
const SUBJECT_ITEM_SHARE_RECEIVED = 'item_share_received';
const SUBJECT_ITEM_SHARED_PUBLICLY = 'item_shared_publicly';
const SUBJECT_ITEM_RENAMED = 'item_renamed';
const SUBJECT_ITEM_RENAMED_SELF = 'item_renamed_self';
@ -135,7 +137,11 @@ class Activity implements \OCP\Activity\IExtension {
case self::SUBJECT_ITEM_EXPIRED:
return $l->t('The password of %1$s has expired, renew it now.', $params)->__toString();
case self::SUBJECT_ITEM_SHARED:
return $l->t('%s has been shared', $params)->__toString();
return $l->t('%1$s has been shared with %2$s', $params)->__toString();
case self::SUBJECT_ITEM_SHARE_RECEIVED:
return $l->t('You received a share request for %1$s from %2$s', $params)->__toString();
case self::SUBJECT_ITEM_SHARED_PUBLICLY:
return $l->t('%s has been shared with a link', $params)->__toString();
}
}
return false;
@ -180,6 +186,7 @@ class Activity implements \OCP\Activity\IExtension {
case self::SUBJECT_ITEM_RENAMED_SELF:
case self::SUBJECT_ITEM_RENAMED:
case self::SUBJECT_ITEM_SHARED:
case self::SUBJECT_ITEM_SHARED_PUBLICLY:
return array(
0 => 'passman',
);

View file

@ -11,6 +11,7 @@
namespace OCA\Passman\Service;
use OCA\Passman\Db\Credential;
use OCA\Passman\Db\SharingACL;
use OCA\Passman\Db\SharingACLMapper;
use OCP\IConfig;
@ -29,6 +30,12 @@ class CredentialService {
$this->sharingACL = $sharingACL;
}
/**
* Create a new credential
* @param $user_id
* @param $item_guid
* @return Credential
*/
public function createCredential($credential) {
return $this->credentialMapper->create($credential);
}

View file

@ -135,7 +135,7 @@ class ShareService {
return $return;
}
/*
/**
* Gets the acl for a given item guid
* @param $user_id
* @param $item_guid