Skip to content
This repository has been archived by the owner on Nov 25, 2020. It is now read-only.

Commit

Permalink
Create Server for /shares/ access point.
Browse files Browse the repository at this point in the history
  • Loading branch information
cdujeu committed Feb 23, 2016
1 parent 7cf1fb0 commit a5f13e1
Show file tree
Hide file tree
Showing 9 changed files with 488 additions and 71 deletions.
108 changes: 49 additions & 59 deletions core/src/plugins/core.ocs/OCSPlugin.php
Expand Up @@ -20,12 +20,21 @@
*/
namespace Pydio\OCS;

use Pydio\OCS\Server\Dummy;

defined('AJXP_EXEC') or die('Access not allowed');

require_once("vendor/autoload.php");

class OCSPlugin extends \AJXP_Plugin{

public function init($options)
{
parent::init($options);
\AJXP_Controller::registerIncludeHook("repository.list", array($this, "populateRemotes"));
\AJXP_Controller::registerIncludeHook("repository.search", array($this, "remoteRepositoryById"));
}

public function federatedEnabled(){
return $this->getConfigs()["ENABLE_FEDERATED_SHARING"] === true;
}
Expand All @@ -50,84 +59,65 @@ public function publishServices(){

public function route($endpoint, $uriParts, $parameters){

$format = isSet($parameters["format"]) && in_array($parameters["format"], array("json", "xml")) ? $parameters["format"] : "json";

if($endpoint == "dav" && $this->federatedEnabled()){

$server = new Server\Dav\Server();
$server->start("/ocs/v2/dav");

}else if($endpoint == "shares" && $this->federatedEnabled()){

$response = $this->buildResponse("ok", 200, null, array("shares" => $uriParts));
$this->sendResponse($response, $format);
$server = new Server\Federated\Server();
$server->run($uriParts, $parameters);

}else{

$response = $this->buildResponse("fail", 503, "Federated Sharing is not active on this server");
$this->sendResponse($response, $format);
Dummy::notImplemented($uriParts, $parameters);

}

}



public function buildResponse($status = "ok", $code = 200, $message = null, $data = null){

$ocs = array(
"ocs" => array(
"meta" => array(
"status" => $status,
"statuscode" => $code,
"message" => $message
)
)
);
if(!empty($data)){
$ocs["ocs"]["data"] = $data;
/**
* Triggered on repository list loading
* @param array $wsList
* @param string $scope
* @param bool $includeShared
*/
public function populateRemotes(&$wsList, $scope = "user", $includeShared = true){
if(!$includeShared || $scope != "user"){
return;
}
return $ocs;

}

public function sendResponse($response, $format = "json"){
if($format == "json"){
header("Content-Type: text/json");
print json_encode($response);
}else if($format == "xml"){
header("Content-Type: text/xml");
print $this->array2xml($response["ocs"], "ocs");
$loggedUser = \AuthService::getLoggedUser();
if($loggedUser == null){
return;
}
$store = new Model\SQLStore();
$shares = $store->remoteSharesForUser($loggedUser->getId());
foreach($shares as $share){
$repo = $share->buildVirtualRepository();
$loggedUser->personalRole->setAcl($repo->getId(), "rw");
$wsList[$repo->getId()] = $repo;
}
if(count($shares)){
$loggedUser->recomputeMergedRole();
\AuthService::updateUser($loggedUser);
}
}

protected function array2xml($array, $node_name="root")
{
$dom = new \DOMDocument('1.0', 'UTF-8');
$dom->formatOutput = true;
$root = $dom->createElement($node_name);
$dom->appendChild($root);

$array2xml = function ($node, $array) use ($dom, &$array2xml) {
foreach ($array as $key => $value) {
if (is_array($value)) {
$n = $dom->createElement($key);
$node->appendChild($n);
$array2xml($n, $value);
} else {
if(is_numeric($key)){
$n = $dom->createElement('element', $value);
}else{
$n = $dom->createElement($key, $value);
}
$node->appendChild($n);
}
}
};

$array2xml($root, $array);

return $dom->saveXML();
public function remoteRepositoryById($repositoryId, &$repoObject){
if(strpos($repositoryId, "ocs_remote_share_") !== 0){
return;
}
$store = new Model\SQLStore();
$remoteShareId = str_replace("ocs_remote_share_", "", $repositoryId);
$share = $store->remoteShareById($remoteShareId);
if($share != null){
$repoObject = $share->buildVirtualRepository();
$loggedUser = \AuthService::getLoggedUser();
$loggedUser->personalRole->setAcl($repoObject->getId(), "rw");
$loggedUser->recomputeMergedRole();
\AuthService::updateUser($loggedUser);
}
}

}
2 changes: 1 addition & 1 deletion core/src/plugins/core.ocs/manifest.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<ajxp_plugin label="CONF_MESSAGE[Open Cloud Specification]" description="CONF_MESSAGE[Implement Open Cloud Specification]" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="file:../core.ajaxplorer/ajxp_registry.xsd">
<class_definition classname="Pydio\OCS\Router" filename="plugins/core.ocs/Router.php"/>
<class_definition classname="Pydio\OCS\OCSPlugin" filename="plugins/core.ocs/OCSPlugin.php"/>
<client_settings>
<resources>
<i18n namespace="core.ocs" path="plugins/core.ocs/i18n"/>
Expand Down
139 changes: 137 additions & 2 deletions core/src/plugins/core.ocs/src/Model/RemoteShare.php
Expand Up @@ -21,7 +21,11 @@
namespace Pydio\OCS\Model;

defined('AJXP_EXEC') or die('Access not allowed');

if(!defined('OCS_INVITATION_STATUS_PENDING')){
define('OCS_INVITATION_STATUS_PENDING', 1);
define('OCS_INVITATION_STATUS_ACCEPTED', 2);
define('OCS_INVITATION_STATUS_REJECTED', 4);
}

class RemoteShare
{
Expand Down Expand Up @@ -96,6 +100,33 @@ public function setId($id){
$this->id = $id;
}

/**
* @return \Repository
*/
public function buildVirtualRepository(){
$repositoryId = "ocs_remote_share_".$this->getOcsToken();
// Create REPO
$parts = parse_url($this->getOcsDavUrl());
$data = array(
"DISPLAY" => $this->getDocumentName(). "[remote]",
"DESCRIPTION" => "Shared by ".$this->getSender(),
"AJXP_SLUG" => "remote-".$this->getOcsToken(),
"DRIVER" => "webdav",
"DRIVER_OPTIONS"=> array(
"HOST" => $parts["scheme"]."://".$parts["host"],
"PATH" => $parts["path"],
"USER" => $this->getOcsToken(),
"PASS" => ($this->hasPassword()?$this->getPassword() : ""),
"DEFAULT_RIGHTS"=> "",
"META_SOURCES" => array()
)
);
$repo = \ConfService::createRepositoryFromArray($repositoryId, $data);
$repo->setWriteable(false);
$repo->setOwnerData(null, $this->getSender()." [remote]");
return $repo;
}

/**
* @return string
*/
Expand Down Expand Up @@ -155,7 +186,7 @@ public function getOcsDavUrl()
/**
* @return boolean
*/
public function isHasPassword()
public function hasPassword()
{
return $this->hasPassword;
}
Expand Down Expand Up @@ -200,5 +231,109 @@ public function getDocumentName()
return $this->documentName;
}

/**
* @param string $ocsToken
*/
public function setOcsToken($ocsToken)
{
$this->ocsToken = $ocsToken;
}

/**
* @param int $ocsRemoteId
*/
public function setOcsRemoteId($ocsRemoteId)
{
$this->ocsRemoteId = $ocsRemoteId;
}

/**
* @param string $user
*/
public function setUser($user)
{
$this->user = $user;
}

/**
* @param string $sender
*/
public function setSender($sender)
{
$this->sender = $sender;
}

/**
* @param string $ocsServiceUrl
*/
public function setOcsServiceUrl($ocsServiceUrl)
{
$this->ocsServiceUrl = $ocsServiceUrl;
}

/**
* @param int $receptionDate
*/
public function setReceptionDate($receptionDate)
{
$this->receptionDate = $receptionDate;
}

/**
* @param string $documentName
*/
public function setDocumentName($documentName)
{
$this->documentName = $documentName;
}

/**
* @param string $status
*/
public function setStatus($status)
{
$this->status = $status;
}

/**
* @param string $ocsDavUrl
*/
public function setOcsDavUrl($ocsDavUrl)
{
$this->ocsDavUrl = $ocsDavUrl;
}

/**
* @param boolean $hasPassword
*/
public function setHasPassword($hasPassword)
{
$this->hasPassword = $hasPassword;
}

/**
* @param null|string $password
*/
public function setPassword($password)
{
$this->password = $password;
}

/**
* @param int $answerDate
*/
public function setAnswerDate($answerDate)
{
$this->answerDate = $answerDate;
}

/**
* @param string $message
*/
public function setMessage($message)
{
$this->message = $message;
}


}
12 changes: 7 additions & 5 deletions core/src/plugins/core.ocs/src/Model/SQLStore.php
Expand Up @@ -37,7 +37,7 @@ public function __construct()
{
$storage = \ConfService::getConfStorageImpl();
if($storage->getId() == "conf.sql") {
$this->confStorage = $storage;
$this->storage = $storage;
}
}

Expand All @@ -52,7 +52,7 @@ public function storeInvitation(ShareInvitation $invitation)
if(empty($id)){
$id = $this->getGUID();
}
$this->storage->simpleStoreSet(OCS_SQLSTORE_NS_INVITATION, $id, OCS_SQLSTORE_FORMAT, $invitation->getLinkHash());
$this->storage->simpleStoreSet(OCS_SQLSTORE_NS_INVITATION, $id, $invitation, OCS_SQLSTORE_FORMAT, $invitation->getLinkHash());
$invitation->setId($id);
return $invitation;
}
Expand Down Expand Up @@ -86,6 +86,7 @@ public function invitationById(string $invitationId)
public function deleteInvitation(ShareInvitation $invitation)
{
$this->storage->simpleStoreClear(OCS_SQLSTORE_NS_INVITATION, $invitation->getId());
return true;
}

/**
Expand All @@ -97,9 +98,9 @@ public function storeRemoteShare(RemoteShare $remoteShare)
{
$id = $remoteShare->getId();
if(empty($id)){
$id = $this->getGUID();
$id = $remoteShare->getOcsToken()."###".$remoteShare->getUser();
}
$this->storage->simpleStoreSet(OCS_SQLSTORE_NS_REMOTE_SHARE, $id, OCS_SQLSTORE_FORMAT, $remoteShare->getUser());
$this->storage->simpleStoreSet(OCS_SQLSTORE_NS_REMOTE_SHARE, $id, $remoteShare, OCS_SQLSTORE_FORMAT, $remoteShare->getUser());
$remoteShare->setId($id);
return $remoteShare;

Expand Down Expand Up @@ -133,7 +134,8 @@ public function remoteShareById($remoteShareId)
*/
public function deleteRemoteShare(RemoteShare $remoteShare)
{
return $this->storage->simpleStoreClear(OCS_SQLSTORE_NS_REMOTE_SHARE, $remoteShare->getId());
$this->storage->simpleStoreClear(OCS_SQLSTORE_NS_REMOTE_SHARE, $remoteShare->getId());
return true;
}

protected function getGUID(){
Expand Down
9 changes: 5 additions & 4 deletions core/src/plugins/core.ocs/src/Model/ShareInvitation.php
Expand Up @@ -21,10 +21,11 @@
namespace Pydio\OCS\Model;

defined('AJXP_EXEC') or die('Access not allowed');

define('OCS_INVITATION_STATUS_PENDING', 1);
define('OCS_INVITATION_STATUS_ACCEPTED', 2);
define('OCS_INVITATION_STATUS_REJECTED', 4);
if(!defined('OCS_INVITATION_STATUS_PENDING')){
define('OCS_INVITATION_STATUS_PENDING', 1);
define('OCS_INVITATION_STATUS_ACCEPTED', 2);
define('OCS_INVITATION_STATUS_REJECTED', 4);
}

class ShareInvitation
{
Expand Down

0 comments on commit a5f13e1

Please sign in to comment.