aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChristian Weiske <cweiske@cweiske.de>2014-08-20 06:27:58 +0200
committerChristian Weiske <cweiske@cweiske.de>2014-08-20 06:27:58 +0200
commit1d7387a458d893664e2537ec811bc053d95600b7 (patch)
tree27ecb02bf62f8378c422a5f2b6df419b40cbacf5
parentdb2f09d46ce2f3a46be1b6f6e031492966242025 (diff)
downloadgrauphel-1d7387a458d893664e2537ec811bc053d95600b7.tar.gz
grauphel-1d7387a458d893664e2537ec811bc053d95600b7.zip
sync could work if php would not crash
-rwxr-xr-xappinfo/app.php20
-rw-r--r--appinfo/application.php14
-rwxr-xr-xappinfo/database.xml9
-rwxr-xr-xappinfo/info.xml2
-rw-r--r--appinfo/routes.php37
-rwxr-xr-xappinfo/version2
-rw-r--r--controller/apicontroller.php176
-rw-r--r--controller/oauthcontroller.php1
l---------src1
9 files changed, 162 insertions, 100 deletions
diff --git a/appinfo/app.php b/appinfo/app.php
index 3e319df..3da4f00 100755
--- a/appinfo/app.php
+++ b/appinfo/app.php
@@ -1,13 +1,13 @@
<?php
-require_once (__DIR__ . '/../src/grauphel/Autoloader.php');
-grauphel\Autoloader::register();
-
//OCP\App::registerAdmin( 'apptemplate', 'settings' );
-OCP\App::addNavigationEntry( array(
- 'id' => 'grauphel',
- 'order' => 2342,
- 'href' => OCP\Util::linkTo( 'grauphel', 'index.php' ),
- 'icon' => OCP\Util::imagePath( 'grauphel', 'notes.png' ),
- 'name' => 'Tomboy notes'
-));
+OCP\App::addNavigationEntry(
+ array(
+ 'id' => 'grauphel',
+ 'order' => 2342,
+ 'href' => OCP\Util::linkTo('grauphel', 'index.php'),
+ 'icon' => OCP\Util::imagePath('grauphel', 'notes.png'),
+ 'name' => 'Tomboy notes'
+ )
+);
+?>
diff --git a/appinfo/application.php b/appinfo/application.php
index 7a1691d..69d1572 100644
--- a/appinfo/application.php
+++ b/appinfo/application.php
@@ -28,18 +28,8 @@ class Application extends App
= $c->query('ServerContainer')->getURLGenerator();
return new \OCA\Grauphel\Controller\ApiController(
$c->query('AppName'),
- $c->query('Request')
- );
- }
- );
- $container->registerService(
- 'AccessController',
- function($c) {
- Dependencies::get()->urlGen
- = $c->query('ServerContainer')->getURLGenerator();
- return new \OCA\Grauphel\Controller\AccessController(
- $c->query('AppName'),
- $c->query('Request')
+ $c->query('Request'),
+ $c->query('Session')->getUser()
);
}
);
diff --git a/appinfo/database.xml b/appinfo/database.xml
index ae089ca..5bf6172 100755
--- a/appinfo/database.xml
+++ b/appinfo/database.xml
@@ -78,6 +78,13 @@
<notnull>true</notnull>
<length>128</length>
</field>
+ <field>
+ <name>note_last_sync_revision</name>
+ <type>integer</type>
+ <default>0</default>
+ <notnull>true</notnull>
+ <length>11</length>
+ </field>
<field>
<name>note_create_date</name>
@@ -152,7 +159,7 @@
<field>
<name>syncdata_user</name>
<type>text</type>
- <notnull>false</notnull>
+ <notnull>true</notnull>
<length>64</length>
</field>
<field>
diff --git a/appinfo/info.xml b/appinfo/info.xml
index ac0f9ec..1008496 100755
--- a/appinfo/info.xml
+++ b/appinfo/info.xml
@@ -3,7 +3,7 @@
<id>grauphel</id>
<name>Grauphel: Tomboy note server</name>
<description>Tomboy REST API server to sync notes between devices</description>
- <version>0.1</version>
+ <version>0.1.1</version>
<licence>AGPL3 or later</licence>
<author>Christian Weiske</author>
<requiremin>7</requiremin>
diff --git a/appinfo/routes.php b/appinfo/routes.php
index 5567670..31e5692 100644
--- a/appinfo/routes.php
+++ b/appinfo/routes.php
@@ -7,22 +7,6 @@ $application->registerRoutes(
array(
'routes' => array(
array(
- 'url' => '/test',
- 'name' => 'access#test',
- ),
-
- array(
- 'url' => '/authorize',
- 'name' => 'access#authorize',
- 'verb' => 'POST',
- ),
- array(
- 'url' => '/login',
- 'name' => 'access#login',
- 'verb' => 'GET',
- ),
-
- array(
'url' => '/oauth/access_token',
'name' => 'oauth#accessToken',
'verb' => 'POST',
@@ -49,23 +33,28 @@ $application->registerRoutes(
'verb' => 'GET',
),
array(
- 'url' => '/api/1.0/{user}/note/{guid}',
- 'name' => 'api#note',
+ 'url' => '/api/1.0/',
+ 'name' => 'api#indexSlash',
'verb' => 'GET',
),
array(
- 'url' => '/api/1.0/{user}/notes',
- 'name' => 'api#notes',
+ 'url' => '/api/1.0/{username}',
+ 'name' => 'api#user',
'verb' => 'GET',
),
array(
- 'url' => '/api/1.0/{user}/notes',
+ 'url' => '/api/1.0/{username}/notes',
'name' => 'api#notes',
- 'verb' => 'POST',
+ 'verb' => 'GET',
),
array(
- 'url' => '/api/1.0/{user}',
- 'name' => 'api#user',
+ 'url' => '/api/1.0/{username}/notes',
+ 'name' => 'api#notesSave',
+ 'verb' => 'PUT',
+ ),
+ array(
+ 'url' => '/api/1.0/{username}/note/{guid}',
+ 'name' => 'api#note',
'verb' => 'GET',
),
)
diff --git a/appinfo/version b/appinfo/version
index 49d5957..17e51c3 100755
--- a/appinfo/version
+++ b/appinfo/version
@@ -1 +1 @@
-0.1
+0.1.1
diff --git a/controller/apicontroller.php b/controller/apicontroller.php
index 8ce8997..166436e 100644
--- a/controller/apicontroller.php
+++ b/controller/apicontroller.php
@@ -16,6 +16,7 @@ namespace OCA\Grauphel\Controller;
use \OCP\AppFramework\Controller;
use \OCP\AppFramework\Http\JSONResponse;
+use \OCA\Grauphel\Lib\NoteStorage;
use \OCA\Grauphel\Lib\OAuth;
use \OCA\Grauphel\Lib\Dependencies;
@@ -32,6 +33,23 @@ use \OCA\Grauphel\Lib\Dependencies;
*/
class ApiController extends Controller
{
+ /**
+ * constructor of the controller
+ *
+ * @param string $appName Name of the app
+ * @param IRequest $request Instance of the request
+ */
+ public function __construct($appName, \OCP\IRequest $request, $user)
+ {
+ parent::__construct($appName, $request);
+ $this->user = $user;
+ $this->deps = Dependencies::get();
+ $this->notes = new NoteStorage($this->deps->urlGen);
+
+ //default http header: we assume something is broken
+ header('HTTP/1.0 500 Internal Server Error');
+ }
+
/**
* /api/1.0
*
@@ -39,7 +57,7 @@ class ApiController extends Controller
* @NoCSRFRequired
* @PublicPage
*/
- public function index()
+ public function index($route = 'grauphel.api.index')
{
$deps = Dependencies::get();
$authenticated = false;
@@ -53,7 +71,7 @@ class ApiController extends Controller
->registerAccessTokenHandler($provider);
$provider->checkOAuthRequest(
$urlGen->getAbsoluteURL(
- $urlGen->linkToRoute('grauphel.api.index')
+ $urlGen->linkToRoute($route)
)
);
$authenticated = true;
@@ -66,6 +84,10 @@ class ApiController extends Controller
if ($e->getCode() != OAUTH_PARAMETER_ABSENT) {
$oauth->error($e);
}
+ if ($this->user !== null) {
+ $username = $this->user->getUID();
+ $authenticated = true;
+ }
}
$data = array(
@@ -85,7 +107,7 @@ class ApiController extends Controller
$data['user-ref'] = array(
'api-ref' => $urlGen->getAbsoluteURL(
$urlGen->linkToRoute(
- 'grauphel.api.user', array('user' => $username)
+ 'grauphel.api.user', array('username' => $username)
)
),
'href' => null,//FIXME
@@ -93,65 +115,106 @@ class ApiController extends Controller
}
return new JSONResponse($data);
- $deps->renderer->sendJson($data);
}
/**
- * GET /api/1.0/$user/notes/$noteguid
+ * /api/1.0/
*
* @NoAdminRequired
* @NoCSRFRequired
* @PublicPage
*/
- public function note()
+ public function indexSlash()
{
- $deps = Dependencies::get();
- $username = $deps->urlGen->loadUsername();
- $guid = $deps->urlGen->loadGuid();
- $oauth = new \OAuth();
- $oauth->setDeps($deps);
- $oauth->verifyOAuthUser($username, $deps->urlGen->note($username, $guid));
+ return $this->index('grauphel.api.indexSlash');
+ }
- $note = $deps->notes->load($username, $guid, false);
- if ($note === null) {
- header('HTTP/1.0 404 Not Found');
- header('Content-type: text/plain');
- echo "Note does not exist\n";
- exit(1);
- }
+ /**
+ * GET /api/1.0/$user
+ *
+ * @NoAdminRequired
+ * @NoCSRFRequired
+ * @PublicPage
+ */
+ public function user($username)
+ {
+ $this->verifyUser($username);
+ $syncdata = $this->notes->loadSyncData($username);
- $data = array('note' => array($note));
- $deps->renderer->sendJson($data);
+ $data = array(
+ 'user-name' => $username,
+ 'first-name' => null,
+ 'last-name' => null,
+ 'notes-ref' => array(
+ 'api-ref' => $this->deps->urlGen->getAbsoluteURL(
+ $this->deps->urlGen->linkToRoute(
+ 'grauphel.api.notes', array('username' => $username)
+ )
+ ),
+ 'href' => null,
+ ),
+ 'latest-sync-revision' => $syncdata->latestSyncRevision,
+ 'current-sync-guid' => $syncdata->currentSyncGuid,
+ );
+ return new JSONResponse($data);
}
/**
- * GET|PUT /api/1.0/$user/notes
+ * GET /api/1.0/$user/notes
*
* @NoAdminRequired
* @NoCSRFRequired
* @PublicPage
*/
- public function notes()
+ public function notes($username)
{
- $deps = Dependencies::get();
- $username = $deps->urlGen->loadUsername();
- $oauth = new \OAuth();
- $oauth->setDeps($deps);
- $oauth->verifyOAuthUser($username, $deps->urlGen->notes($username));
-
- $syncdata = $deps->notes->loadSyncData($username);
+ $this->verifyUser(
+ $username,
+ $this->deps->urlGen->getAbsoluteURL(
+ $this->deps->urlGen->linkToRoute(
+ 'grauphel.api.notes', array('username' => $username)
+ )
+ )
+ );
+ $syncdata = $this->notes->loadSyncData($username);
+ return $this->fetchNotes($username, $syncdata);
+ }
+ /**
+ * PUT /api/1.0/$user/notes
+ *
+ * @NoAdminRequired
+ * @NoCSRFRequired
+ * @PublicPage
+ */
+ public function notesSave($username)
+ {
+ $this->verifyUser(
+ $username,
+ $this->deps->urlGen->getAbsoluteURL(
+ $this->deps->urlGen->linkToRoute(
+ 'grauphel.api.user', array('username' => $username)
+ )
+ )
+ );
+ $syncdata = $this->notes->loadSyncData($username);
+
$this->handleNoteSave($username, $syncdata);
+ return $this->fetchNotes($username, $syncdata);
+ }
+
+ protected function fetchNotes($username, $syncdata)
+ {
$since = null;
if (isset($_GET['since'])) {
$since = (int) $_GET['since'];
}
if (isset($_GET['include_notes']) && $_GET['include_notes']) {
- $notes = $deps->notes->loadNotesFull($username, $since);
+ $notes = $this->notes->loadNotesFull($username, $since);
} else {
- $notes = $deps->notes->loadNotesOverview($username, $since);
+ $notes = $this->notes->loadNotesOverview($username, $since);
}
//work around bug https://bugzilla.gnome.org/show_bug.cgi?id=734313
@@ -165,7 +228,7 @@ class ApiController extends Controller
'latest-sync-revision' => $syncdata->latestSyncRevision,
'notes' => $notes,
);
- $deps->renderer->sendJson($data);
+ return new JSONResponse($data);
}
protected function handleNoteSave($username, $syncdata)
@@ -219,35 +282,50 @@ class ApiController extends Controller
}
/**
- * GET /api/1.0/$user
+ * GET /api/1.0/$user/notes/$noteguid
*
* @NoAdminRequired
* @NoCSRFRequired
* @PublicPage
*/
- public function user()
+ public function note()
{
+ //FIXME
$deps = Dependencies::get();
$username = $deps->urlGen->loadUsername();
-
+ $guid = $deps->urlGen->loadGuid();
$oauth = new \OAuth();
$oauth->setDeps($deps);
- $oauth->verifyOAuthUser($username, $deps->urlGen->user($username));
+ $oauth->verifyOAuthUser($username, $deps->urlGen->note($username, $guid));
- $syncdata = $deps->notes->loadSyncData($username);
+ $note = $deps->notes->load($username, $guid, false);
+ if ($note === null) {
+ header('HTTP/1.0 404 Not Found');
+ header('Content-type: text/plain');
+ echo "Note does not exist\n";
+ exit(1);
+ }
- $data = array(
- 'user-name' => $username,
- 'first-name' => null,
- 'last-name' => null,
- 'notes-ref' => array(
- 'api-ref' => $deps->urlGen->notes($username),
- 'href' => null,
- ),
- 'latest-sync-revision' => $syncdata->latestSyncRevision,
- 'current-sync-guid' => $syncdata->currentSyncGuid,
- );
+ $data = array('note' => array($note));
$deps->renderer->sendJson($data);
}
+
+ /**
+ * Checks if the given user is authorized (by oauth token or normal login)
+ *
+ * @param string $username Username to verify
+ *
+ * @return boolean True if all is fine, Response in case of an error
+ */
+ protected function verifyUser($username, $curUrl)
+ {
+ if ($this->user !== null && $this->user->getUID() == $username) {
+ return true;
+ }
+
+ $oauth = new OAuth();
+ $oauth->setDeps($this->deps);
+ $oauth->verifyOAuthUser($username, $curUrl);
+ }
}
?>
diff --git a/controller/oauthcontroller.php b/controller/oauthcontroller.php
index 1dfdec9..ceaa935 100644
--- a/controller/oauthcontroller.php
+++ b/controller/oauthcontroller.php
@@ -15,7 +15,6 @@ namespace OCA\Grauphel\Controller;
use \OCP\AppFramework\Controller;
use \OCP\AppFramework\Http;
-use \OCP\AppFramework\Http\JSONResponse;
use \OCP\AppFramework\Http\RedirectResponse;
use \OCP\AppFramework\Http\TemplateResponse;
diff --git a/src b/src
deleted file mode 120000
index acc4488..0000000
--- a/src
+++ /dev/null
@@ -1 +0,0 @@
-../../grauphel/src \ No newline at end of file