From: Christian Weiske Date: Wed, 20 Aug 2014 04:27:58 +0000 (+0200) Subject: sync could work if php would not crash X-Git-Tag: v0.1.0~19 X-Git-Url: https://git.cweiske.de/grauphel.git/commitdiff_plain/1d7387a458d893664e2537ec811bc053d95600b7 sync could work if php would not crash --- 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 @@ '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 @@ true 128 + + note_last_sync_revision + integer + 0 + true + 11 + note_create_date @@ -152,7 +159,7 @@ syncdata_user text - false + true 64 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 @@ grauphel Grauphel: Tomboy note server Tomboy REST API server to sync notes between devices - 0.1 + 0.1.1 AGPL3 or later Christian Weiske 7 diff --git a/appinfo/routes.php b/appinfo/routes.php index 5567670..31e5692 100644 --- a/appinfo/routes.php +++ b/appinfo/routes.php @@ -6,22 +6,6 @@ $application->registerRoutes( $this, 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', @@ -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