Signed-off-by: Bjoern Schiessle <bjoern@schiessle.org>tags/v14.0.0beta1
@@ -46,9 +46,9 @@ class Capabilities implements ICapability { | |||
$capabilities = ['ocm' => | |||
[ | |||
'enabled' => true, | |||
'api-version' => '1.0-proposal1', | |||
'end-point' => substr($url, 0, strrpos($url, '/')), | |||
'share-types' => ['file'], | |||
'apiVersion' => '1.0-proposal1', | |||
'endPoint' => substr($url, 0, strrpos($url, '/')), | |||
'shareTypes' => ['file'], | |||
'protocol' => [ | |||
'webdav' => '/public.php/webdav/', | |||
] |
@@ -105,16 +105,16 @@ class RequestHandlerController extends Controller { | |||
* @param string $owner provider specific UID of the user who owns the resource | |||
* @param string $ownerDisplayName display name of the user who shared the item | |||
* @param string $sharedBy provider specific UID of the user who shared the resource | |||
* @param $sharedByDisplayName display name of the user who shared the resource | |||
* @param string $sharedByDisplayName display name of the user who shared the resource | |||
* @param string $sharedSecret use to authenticate accross servers | |||
* @param array $protocol (e,.g. ['name' => 'webdav', 'options' => ['username' => 'john', 'permissions' => 31]]) | |||
* @param string $shareType ('group' or 'user' share) | |||
* @param $resourceType ('file', 'calendar',...) | |||
* @return Http\DataResponse|JSONResponse | |||
* | |||
* Example: curl -H "Content-Type: application/json" -X POST -d '{"shareWith":"admin1@serve1","name":"welcome server2.txt","description":"desc","providerId":"2","owner":"admin2@http://localhost/server2","ownerDisplayName":"admin2 display","shareType":"user","resourceType":"file","protocol":{"name":"webdav","options":{"access_token":"8Lrd1FVEREthux7","permissions":31}}}' http://localhost/server/index.php/ocm/shares | |||
* Example: curl -H "Content-Type: application/json" -X POST -d '{"shareWith":"admin1@serve1","name":"welcome server2.txt","description":"desc","providerId":"2","owner":"admin2@http://localhost/server2","ownerDisplayName":"admin2 display","shareType":"user","resourceType":"file","protocol":{"name":"webdav","options":{"sharedSecret":"secret","permissions":"webdav-property"}}}' http://localhost/server/index.php/ocm/shares | |||
*/ | |||
public function addShare($shareWith, $name, $description, $providerId, $owner, $ownerDisplayName, $sharedBy, $sharedByDisplayName, $protocol, $shareType, $resourceType) { | |||
if (!$this->config->incomingRequestsEnabled()) { | |||
return new JSONResponse( | |||
['message' => 'This server doesn\'t support outgoing federated shares'], | |||
@@ -132,7 +132,8 @@ class RequestHandlerController extends Controller { | |||
!is_array($protocol) || | |||
!isset($protocol['name']) || | |||
!isset ($protocol['options']) || | |||
!is_array($protocol['options']) | |||
!is_array($protocol['options']) || | |||
!isset($protocol['options']['sharedSecret']) | |||
) { | |||
return new JSONResponse( | |||
['message' => 'Missing arguments'], | |||
@@ -163,7 +164,8 @@ class RequestHandlerController extends Controller { | |||
try { | |||
$provider = $this->cloudFederationProviderManager->getCloudFederationProvider($resourceType); | |||
$share = $this->factory->getCloudFederationShare($shareWith, $name, $description, $providerId, $owner, $ownerDisplayName, $sharedBy, $sharedByDisplayName, $protocol, $shareType, $resourceType); | |||
$share = $this->factory->getCloudFederationShare($shareWith, $name, $description, $providerId, $owner, $ownerDisplayName, $sharedBy, $sharedByDisplayName, '', $shareType, $resourceType); | |||
$share->setProtocol($protocol); | |||
$id = $provider->shareReceived($share); | |||
} catch (ProviderDoesNotExistsException $e) { | |||
return new JSONResponse( | |||
@@ -191,12 +193,17 @@ class RequestHandlerController extends Controller { | |||
/** | |||
* receive notification about existing share | |||
* | |||
* @NoCSRFRequired | |||
* @PublicPage | |||
* @BruteForceProtection(action=receiveFederatedShareNotification) | |||
* | |||
* @param string $notificationType (notification type, e.g. SHARE_ACCEPTED) | |||
* @param string $resourceType (calendar, file, contact,...) | |||
* @param array $message contain the actual notification, content is defined by cloud federation provider | |||
* @param string $providerId id of the share | |||
* @param array $notification the actual payload of the notification | |||
* @return JSONResponse | |||
*/ | |||
public function receiveNotification($notificationType, $resourceType, $message) { | |||
public function receiveNotification($notificationType, $resourceType, $providerId, array $notification) { | |||
if (!$this->config->incomingRequestsEnabled()) { | |||
return new JSONResponse( | |||
['message' => 'This server doesn\'t support outgoing federated shares'], | |||
@@ -207,7 +214,8 @@ class RequestHandlerController extends Controller { | |||
// check if all required parameters are set | |||
if ($notificationType === null || | |||
$resourceType === null || | |||
!is_array($message) | |||
$providerId === null || | |||
!is_array($notification) | |||
) { | |||
return new JSONResponse( | |||
['message' => 'Missing arguments'], | |||
@@ -217,7 +225,7 @@ class RequestHandlerController extends Controller { | |||
try { | |||
$provider = $this->cloudFederationProviderManager->getCloudFederationProvider($resourceType); | |||
$provider->notificationReceived($notificationType, $message); | |||
$provider->notificationReceived($notificationType, $providerId, $notification); | |||
} catch (ProviderDoesNotExistsException $e) { | |||
return new JSONResponse( | |||
['message' => $e->getMessage()], | |||
@@ -241,10 +249,7 @@ class RequestHandlerController extends Controller { | |||
} | |||
return new JSONResponse( | |||
['id' => $id, 'createdAt' => date()], | |||
Http::STATUS_CREATED); | |||
return new JSONResponse([],Http::STATUS_CREATED); | |||
} | |||
@@ -170,7 +170,7 @@ class RequestHandlerController extends OCSController { | |||
$owner, | |||
$sharedByFederatedId, | |||
$sharedBy, | |||
['name' => 'webdav', 'options' => ['access_token' => $token]], | |||
$token, | |||
'user', | |||
'file' | |||
); |
@@ -379,7 +379,7 @@ class Notifications { | |||
$fields['owner'], | |||
$fields['sharedByFederatedId'], | |||
$fields['sharedBy'], | |||
['name' => 'webdav', 'options' => ['access_token' => $fields['token'], 'permissions' => ['read', 'write', 'share']]], | |||
$fields['token'], | |||
'user', | |||
'file' | |||
); |
@@ -135,7 +135,7 @@ class CloudFederationProviderFiles implements ICloudFederationProvider { | |||
list($ownerUid, $remote) = $this->addressHandler->splitUserRemote($share->getOwner()); | |||
$remote = $remote; | |||
$token = isset($protocol['options']['access_token']) ? $protocol['options']['access_token'] : null; | |||
$token = $share->getShareSecret(); | |||
$name = $share->getResourceName(); | |||
$owner = $share->getOwnerDisplayName(); | |||
$sharedBy = $share->getSharedByDisplayName(); | |||
@@ -234,21 +234,22 @@ class CloudFederationProviderFiles implements ICloudFederationProvider { | |||
* notification received from another server | |||
* | |||
* @param string $notificationType (e.g. SHARE_ACCEPTED) | |||
* @param array $message | |||
* @param string $providerId id of the share | |||
* @param array $notification payload of the notification | |||
* | |||
* @throws ShareNotFoundException | |||
* @throws ActionNotSupportedException | |||
* | |||
* @since 14.0.0 | |||
*/ | |||
public function notificationReceived($notificationType, array $message) { | |||
public function notificationReceived($notificationType, $providerId, array $notification) { | |||
switch ($notificationType) { | |||
case 'SHARE_ACCEPTED' : | |||
return; | |||
} | |||
throw new ActionNotSupportedException($notificationType); | |||
throw new ActionNotSupportedException($notification); | |||
} | |||
/** |
@@ -324,7 +324,7 @@ class Manager { | |||
* | |||
* @param string $remoteDomain | |||
* @param string $token | |||
* @param $remoteId | |||
* @param $remoteId id of the share | |||
* @param string $feedback | |||
* @return mixed | |||
*/ | |||
@@ -332,11 +332,15 @@ class Manager { | |||
switch ($feedback) { | |||
case 'accept': | |||
$notification = $this->cloudFederationFactory->getCloudFederationNotification(); | |||
$notification->setMessage('SHARE_ACCEPTED', 'file', | |||
$notification->setMessage( | |||
'SHARE_ACCEPTED', | |||
'file', | |||
$remoteId, | |||
[ | |||
'id' => $remoteId, | |||
'access_token' => $token | |||
'sharedSecret' => $token, | |||
'message' => 'Recipient accept the share' | |||
] | |||
); | |||
return $this->cloudFederationProviderManager->sendNotification($remoteDomain, $notification); | |||
} |
@@ -37,16 +37,16 @@ class CloudFederationFactory implements ICloudFederationFactory { | |||
* @param string $owner provider specific UID of the user who owns the resource | |||
* @param string $ownerDisplayName display name of the user who shared the item | |||
* @param string $sharedBy provider specific UID of the user who shared the resource | |||
* @param $sharedByDisplayName display name of the user who shared the resource | |||
* @param array $protocol (e,.g. ['name' => 'webdav', 'options' => ['username' => 'john', 'permissions' => 31]]) | |||
* @param string $sharedByDisplayName display name of the user who shared the resource | |||
* @param string $sharedSecret used to authenticate requests across servers | |||
* @param string $shareType ('group' or 'user' share) | |||
* @param $resourceType ('file', 'calendar',...) | |||
* @return ICloudFederationShare | |||
* | |||
* @since 14.0.0 | |||
*/ | |||
public function getCloudFederationShare($shareWith, $name, $description, $providerId, $owner, $ownerDisplayName, $sharedBy, $sharedByDisplayName, $protocol, $shareType, $resourceType) { | |||
return new CloudFederationShare($shareWith, $name, $description, $providerId, $owner, $ownerDisplayName, $sharedBy, $sharedByDisplayName, $protocol, $shareType, $resourceType); | |||
public function getCloudFederationShare($shareWith, $name, $description, $providerId, $owner, $ownerDisplayName, $sharedBy, $sharedByDisplayName, $sharedSecret, $shareType, $resourceType) { | |||
return new CloudFederationShare($shareWith, $name, $description, $providerId, $owner, $ownerDisplayName, $sharedBy, $sharedByDisplayName, $shareType, $resourceType, $sharedSecret); | |||
} | |||
/** |
@@ -32,16 +32,19 @@ class CloudFederationNotification implements ICloudFederationNotification { | |||
* | |||
* @param string $notificationType (e.g. SHARE_ACCEPTED) | |||
* @param string $resourceType (e.g. file, calendar, contact,...) | |||
* @param array $message | |||
* @param string $providerId id of the share | |||
* @param array $notification payload of the notification | |||
* | |||
* @since 14.0.0 | |||
*/ | |||
public function setMessage($notificationType, $resourceType, array $message) { | |||
public function setMessage($notificationType, $resourceType, $providerId, array $notification) { | |||
$this->message = [ | |||
'notificationType' => $notificationType, | |||
'resourceType' => $resourceType, | |||
'message' => $message, | |||
'providerId' => $providerId, | |||
'notification' => $notification, | |||
]; | |||
} | |||
/** |
@@ -57,7 +57,7 @@ class CloudFederationProviderManager implements ICloudFederationProviderManager | |||
/** @var ILogger */ | |||
private $logger; | |||
private $supportedAPIVersion = '2.0-draft'; | |||
private $supportedAPIVersion = '1.0-proposal1'; | |||
/** | |||
* CloudFederationProviderManager constructor. | |||
@@ -131,7 +131,8 @@ class CloudFederationProviderManager implements ICloudFederationProviderManager | |||
} | |||
public function sendShare(ICloudFederationShare $share) { | |||
$ocmEndPoint = $this->getOCMEndPoint($share->getShareWith()); | |||
$cloudID = $this->cloudIdManager->resolveCloudId($share->getShareWith()); | |||
$ocmEndPoint = $this->getOCMEndPoint($cloudID->getRemote()); | |||
if (empty($ocmEndPoint)) { | |||
return false; | |||
@@ -203,14 +204,13 @@ class CloudFederationProviderManager implements ICloudFederationProviderManager | |||
/** | |||
* check if server supports the new OCM api and ask for the correct end-point | |||
* | |||
* @param string $recipient full federated cloud ID of the recipient of a share | |||
* @param string $url full base URL of the cloud server | |||
* @return string | |||
*/ | |||
protected function getOCMEndPoint($recipient) { | |||
$cloudId = $this->cloudIdManager->resolveCloudId($recipient); | |||
protected function getOCMEndPoint($url) { | |||
$client = $this->httpClientService->newClient(); | |||
try { | |||
$response = $client->get($cloudId->getRemote() . '/ocm-provider/', ['timeout' => 10, 'connect_timeout' => 10]); | |||
$response = $client->get($url . '/ocm-provider/', ['timeout' => 10, 'connect_timeout' => 10]); | |||
} catch (\Exception $e) { | |||
return ''; | |||
} | |||
@@ -218,10 +218,10 @@ class CloudFederationProviderManager implements ICloudFederationProviderManager | |||
$result = $response->getBody(); | |||
$result = json_decode($result, true); | |||
$supportedVersion = isset($result['api-version']) && $result['api-version'] === $this->supportedAPIVersion; | |||
$supportedVersion = isset($result['apiVersion']) && $result['apiVersion'] === $this->supportedAPIVersion; | |||
if (isset($result['end-point']) && $supportedVersion) { | |||
return $result['end-point']; | |||
if (isset($result['endPoint']) && $supportedVersion) { | |||
return $result['endPoint']; | |||
} | |||
return ''; |
@@ -50,10 +50,9 @@ class CloudFederationShare implements ICloudFederationShare { | |||
* @param string $ownerDisplayName display name of the user who shared the item | |||
* @param string $sharedBy provider specific UID of the user who shared the resource | |||
* @param string $sharedByDisplayName display name of the user who shared the resource | |||
* @param array $protocol (e,.g. ['name' => 'webdav', 'options' => ['username' => 'john', 'permissions' => 31]]) | |||
* @param string $shareType ('group' or 'user' share) | |||
* @param $resourceType ('file', 'calendar',...) | |||
* | |||
* @param string $resourceType ('file', 'calendar',...) | |||
* @param string $sharedSecret | |||
*/ | |||
public function __construct($shareWith = '', | |||
$name = '', | |||
@@ -63,9 +62,9 @@ class CloudFederationShare implements ICloudFederationShare { | |||
$ownerDisplayName = '', | |||
$sharedBy = '', | |||
$sharedByDisplayName = '', | |||
$protocol = [], | |||
$shareType = '', | |||
$resourceType = '' | |||
$resourceType = '', | |||
$sharedSecret = '' | |||
) { | |||
$this->setShareWith($shareWith); | |||
$this->setResourceName($name); | |||
@@ -75,7 +74,13 @@ class CloudFederationShare implements ICloudFederationShare { | |||
$this->setOwnerDisplayName($ownerDisplayName); | |||
$this->setSharedBy($sharedBy); | |||
$this->setSharedByDisplayName($sharedByDisplayName); | |||
$this->setProtocol($protocol); | |||
$this->setProtocol([ | |||
'name' => 'webdav', | |||
'options' => [ | |||
'sharedSecret' => $sharedSecret, | |||
'permissions' => '{http://open-collaboration-services.org/ns}share-permissions' | |||
] | |||
]); | |||
$this->setShareType($shareType); | |||
$this->setResourceType($resourceType); | |||
@@ -323,6 +328,17 @@ class CloudFederationShare implements ICloudFederationShare { | |||
return $this->share['shareType']; | |||
} | |||
/** | |||
* get share Secret | |||
* | |||
* @return string | |||
* | |||
* @since 14.0.0 | |||
*/ | |||
public function getShareSecret() { | |||
return $this->share['protocol']['options']['sharedSecret']; | |||
} | |||
/** | |||
* get protocol specification | |||
* |
@@ -33,15 +33,15 @@ interface ICloudFederationFactory { | |||
* @param string $owner provider specific UID of the user who owns the resource | |||
* @param string $ownerDisplayName display name of the user who shared the item | |||
* @param string $sharedBy provider specific UID of the user who shared the resource | |||
* @param $sharedByDisplayName display name of the user who shared the resource | |||
* @param array $protocol (e,.g. ['name' => 'webdav', 'options' => ['username' => 'john', 'permissions' => 31]]) | |||
* @param string $sharedByDisplayName display name of the user who shared the resource | |||
* @param string $sharedSecret used to authenticate requests across servers | |||
* @param string $shareType ('group' or 'user' share) | |||
* @param $resourceType ('file', 'calendar',...) | |||
* @return ICloudFederationShare | |||
* | |||
* @since 14.0.0 | |||
*/ | |||
public function getCloudFederationShare($shareWith, $name, $description, $providerId, $owner, $ownerDisplayName, $sharedBy, $sharedByDisplayName, $protocol, $shareType, $resourceType); | |||
public function getCloudFederationShare($shareWith, $name, $description, $providerId, $owner, $ownerDisplayName, $sharedBy, $sharedByDisplayName, $sharedSecret, $shareType, $resourceType); | |||
/** | |||
* get a Cloud FederationNotification object to prepare a notification you |
@@ -28,11 +28,13 @@ interface ICloudFederationNotification { | |||
* | |||
* @param string $notificationType (e.g. SHARE_ACCEPTED) | |||
* @param string $resourceType (e.g. file, calendar, contact,...) | |||
* @param array $message | |||
* @param $providerId id of the share | |||
* @param array $notification , payload of the notification | |||
* | |||
* @return | |||
* @since 14.0.0 | |||
*/ | |||
public function setMessage($notificationType, $resourceType, array $message); | |||
public function setMessage($notificationType, $resourceType, $providerId, array $notification); | |||
/** | |||
* get message, ready to send out |
@@ -62,13 +62,14 @@ interface ICloudFederationProvider { | |||
* notification received from another server | |||
* | |||
* @param string $notificationType (e.g SHARE_ACCEPTED) | |||
* @param array $message provider specific notification | |||
* @param string $providerId share ID | |||
* @param array $notification provider specific notification | |||
* | |||
* @throws ShareNotFoundException | |||
* @throws ActionNotSupportedException | |||
* | |||
* @since 14.0.0 | |||
*/ | |||
public function notificationReceived($notificationType, array $message); | |||
public function notificationReceived($notificationType, $providerId, array $notification); | |||
} |
@@ -221,6 +221,16 @@ interface ICloudFederationShare { | |||
*/ | |||
public function getShareType(); | |||
/** | |||
* get share Secret | |||
* | |||
* @return string | |||
* | |||
* @since 14.0.0 | |||
*/ | |||
public function getShareSecret(); | |||
/** | |||
* get protocol specification | |||
* |