adjust to latest api version
Signed-off-by: Bjoern Schiessle <bjoern@schiessle.org>
This commit is contained in:
parent
daba042d26
commit
bbce8c3ea1
|
@ -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
|
||||
*
|
||||
|
|
Loading…
Reference in New Issue