Merge pull request #4459 from owncloud/appframework-master
Public API for OC6+ (includes AppFramework)
This commit is contained in:
commit
480aeb804f
|
@ -26,7 +26,7 @@ $files = array();
|
|||
if($mimetypes && !in_array('httpd/unix-directory', $mimetypes)) {
|
||||
foreach( \OC\Files\Filesystem::getDirectoryContent( $dir, 'httpd/unix-directory' ) as $file ) {
|
||||
$file['directory'] = $dir;
|
||||
$file['isPreviewAvailable'] = \OCP\Preview::isMimeSupported($file['mimetype']);
|
||||
$file['isPreviewAvailable'] = \OC::$server->getPreviewManager()->isMimeSupported($file['mimetype']);
|
||||
$file["date"] = OCP\Util::formatDate($file["mtime"]);
|
||||
$file['mimetype_icon'] = \OCA\Files\Helper::determineIcon($file);
|
||||
$files[] = $file;
|
||||
|
@ -37,7 +37,7 @@ if (is_array($mimetypes) && count($mimetypes)) {
|
|||
foreach ($mimetypes as $mimetype) {
|
||||
foreach( \OC\Files\Filesystem::getDirectoryContent( $dir, $mimetype ) as $file ) {
|
||||
$file['directory'] = $dir;
|
||||
$file['isPreviewAvailable'] = \OCP\Preview::isMimeSupported($file['mimetype']);
|
||||
$file['isPreviewAvailable'] = \OC::$server->getPreviewManager()->isMimeSupported($file['mimetype']);
|
||||
$file["date"] = OCP\Util::formatDate($file["mtime"]);
|
||||
$file['mimetype_icon'] = \OCA\Files\Helper::determineIcon($file);
|
||||
$files[] = $file;
|
||||
|
@ -46,7 +46,7 @@ if (is_array($mimetypes) && count($mimetypes)) {
|
|||
} else {
|
||||
foreach( \OC\Files\Filesystem::getDirectoryContent( $dir ) as $file ) {
|
||||
$file['directory'] = $dir;
|
||||
$file['isPreviewAvailable'] = \OCP\Preview::isMimeSupported($file['mimetype']);
|
||||
$file['isPreviewAvailable'] = \OC::$server->getPreviewManager()->isMimeSupported($file['mimetype']);
|
||||
$file["date"] = OCP\Util::formatDate($file["mtime"]);
|
||||
$file['mimetype_icon'] = \OCA\Files\Helper::determineIcon($file);
|
||||
$files[] = $file;
|
||||
|
|
|
@ -84,7 +84,7 @@ class Helper
|
|||
}
|
||||
}
|
||||
$i['directory'] = $dir;
|
||||
$i['isPreviewAvailable'] = \OCP\Preview::isMimeSupported($i['mimetype']);
|
||||
$i['isPreviewAvailable'] = \OC::$server->getPreviewManager()->isMimeSupported($i['mimetype']);
|
||||
$i['icon'] = \OCA\Files\Helper::determineIcon($i);
|
||||
$files[] = $i;
|
||||
}
|
||||
|
|
|
@ -188,7 +188,7 @@ if (isset($path)) {
|
|||
} else {
|
||||
$i['extension'] = '';
|
||||
}
|
||||
$i['isPreviewAvailable'] = \OCP\Preview::isMimeSupported($i['mimetype']);
|
||||
$i['isPreviewAvailable'] = \OC::$server->getPreviewManager()->isMimeSupported($i['mimetype']);
|
||||
}
|
||||
$i['directory'] = $getPath;
|
||||
$i['permissions'] = OCP\PERMISSION_READ;
|
||||
|
|
|
@ -61,7 +61,7 @@ class Helper
|
|||
$i['directory'] = '';
|
||||
}
|
||||
$i['permissions'] = \OCP\PERMISSION_READ;
|
||||
$i['isPreviewAvailable'] = \OCP\Preview::isMimeSupported($r['mime']);
|
||||
$i['isPreviewAvailable'] = \OC::$server->getPreviewManager()->isMimeSupported($r['mime']);
|
||||
$i['icon'] = \OCA\Files\Helper::determineIcon($i);
|
||||
$files[] = $i;
|
||||
}
|
||||
|
|
|
@ -31,7 +31,7 @@ try {
|
|||
|
||||
} catch (Exception $ex) {
|
||||
//show the user a detailed error page
|
||||
OC_Response::setStatus(OC_Response::STATUS_INTERNAL_SERVER_ERROR);
|
||||
\OCP\Util::writeLog('index', $ex->getMessage(), \OCP\Util::FATAL);
|
||||
OC_Response::setStatus(OC_Response::STATUS_INTERNAL_SERVER_ERROR);
|
||||
OC_Template::printExceptionErrorPage($ex);
|
||||
}
|
||||
|
|
|
@ -0,0 +1,77 @@
|
|||
<?php
|
||||
/**
|
||||
* Copyright (c) 2013 Bart Visscher <bartv@thisnet.nl>
|
||||
* This file is licensed under the Affero General Public License version 3 or
|
||||
* later.
|
||||
* See the COPYING-README file.
|
||||
*
|
||||
*/
|
||||
|
||||
namespace OC;
|
||||
|
||||
/**
|
||||
* Class to combine all the configuration options ownCloud offers
|
||||
*/
|
||||
class AllConfig implements \OCP\IConfig {
|
||||
/**
|
||||
* Sets a new system wide value
|
||||
* @param string $key the key of the value, under which will be saved
|
||||
* @param string $value the value that should be stored
|
||||
* @todo need a use case for this
|
||||
*/
|
||||
// public function setSystemValue($key, $value) {
|
||||
// \OCP\Config::setSystemValue($key, $value);
|
||||
// }
|
||||
|
||||
/**
|
||||
* Looks up a system wide defined value
|
||||
* @param string $key the key of the value, under which it was saved
|
||||
* @return string the saved value
|
||||
*/
|
||||
public function getSystemValue($key) {
|
||||
return \OCP\Config::getSystemValue($key, '');
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Writes a new app wide value
|
||||
* @param string $appName the appName that we want to store the value under
|
||||
* @param string $key the key of the value, under which will be saved
|
||||
* @param string $value the value that should be stored
|
||||
*/
|
||||
public function setAppValue($appName, $key, $value) {
|
||||
\OCP\Config::setAppValue($appName, $key, $value);
|
||||
}
|
||||
|
||||
/**
|
||||
* Looks up an app wide defined value
|
||||
* @param string $appName the appName that we stored the value under
|
||||
* @param string $key the key of the value, under which it was saved
|
||||
* @return string the saved value
|
||||
*/
|
||||
public function getAppValue($appName, $key) {
|
||||
return \OCP\Config::getAppValue($appName, $key, '');
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Set a user defined value
|
||||
* @param string $userId the userId of the user that we want to store the value under
|
||||
* @param string $appName the appName that we want to store the value under
|
||||
* @param string $key the key under which the value is being stored
|
||||
* @param string $value the value that you want to store
|
||||
*/
|
||||
public function setUserValue($userId, $appName, $key, $value) {
|
||||
\OCP\Config::setUserValue($userId, $appName, $key, $value);
|
||||
}
|
||||
|
||||
/**
|
||||
* Shortcut for getting a user defined value
|
||||
* @param string $userId the userId of the user that we want to store the value under
|
||||
* @param string $appName the appName that we stored the value under
|
||||
* @param string $key the key under which the value is being stored
|
||||
*/
|
||||
public function getUserValue($userId, $appName, $key){
|
||||
return \OCP\Config::getUserValue($userId, $appName, $key);
|
||||
}
|
||||
}
|
31
lib/app.php
31
lib/app.php
|
@ -27,8 +27,6 @@
|
|||
* upgrading and removing apps.
|
||||
*/
|
||||
class OC_App{
|
||||
static private $activeapp = '';
|
||||
static private $navigation = array();
|
||||
static private $settingsForms = array();
|
||||
static private $adminForms = array();
|
||||
static private $personalForms = array();
|
||||
|
@ -271,7 +269,7 @@ class OC_App{
|
|||
|
||||
/**
|
||||
* @brief adds an entry to the navigation
|
||||
* @param string $data array containing the data
|
||||
* @param array $data array containing the data
|
||||
* @return bool
|
||||
*
|
||||
* This function adds a new entry to the navigation visible to users. $data
|
||||
|
@ -287,11 +285,7 @@ class OC_App{
|
|||
* the navigation. Lower values come first.
|
||||
*/
|
||||
public static function addNavigationEntry( $data ) {
|
||||
$data['active']=false;
|
||||
if(!isset($data['icon'])) {
|
||||
$data['icon']='';
|
||||
}
|
||||
OC_App::$navigation[] = $data;
|
||||
OC::$server->getNavigationManager()->add($data);
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -305,9 +299,7 @@ class OC_App{
|
|||
* highlighting the current position of the user.
|
||||
*/
|
||||
public static function setActiveNavigationEntry( $id ) {
|
||||
// load all the apps, to make sure we have all the navigation entries
|
||||
self::loadApps();
|
||||
self::$activeapp = $id;
|
||||
OC::$server->getNavigationManager()->setActiveEntry($id);
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -315,15 +307,14 @@ class OC_App{
|
|||
* @brief Get the navigation entries for the $app
|
||||
* @param string $app app
|
||||
* @return array of the $data added with addNavigationEntry
|
||||
*
|
||||
* Warning: destroys the existing entries
|
||||
*/
|
||||
public static function getAppNavigationEntries($app) {
|
||||
if(is_file(self::getAppPath($app).'/appinfo/app.php')) {
|
||||
$save = self::$navigation;
|
||||
self::$navigation = array();
|
||||
OC::$server->getNavigationManager()->clear();
|
||||
require $app.'/appinfo/app.php';
|
||||
$app_entries = self::$navigation;
|
||||
self::$navigation = $save;
|
||||
return $app_entries;
|
||||
return OC::$server->getNavigationManager()->getAll();
|
||||
}
|
||||
return array();
|
||||
}
|
||||
|
@ -336,7 +327,7 @@ class OC_App{
|
|||
* setActiveNavigationEntry
|
||||
*/
|
||||
public static function getActiveNavigationEntry() {
|
||||
return self::$activeapp;
|
||||
return OC::$server->getNavigationManager()->getActiveEntry();
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -419,8 +410,9 @@ class OC_App{
|
|||
|
||||
// This is private as well. It simply works, so don't ask for more details
|
||||
private static function proceedNavigation( $list ) {
|
||||
$activeapp = OC::$server->getNavigationManager()->getActiveEntry();
|
||||
foreach( $list as &$naventry ) {
|
||||
if( $naventry['id'] == self::$activeapp ) {
|
||||
if( $naventry['id'] == $activeapp ) {
|
||||
$naventry['active'] = true;
|
||||
}
|
||||
else{
|
||||
|
@ -572,7 +564,8 @@ class OC_App{
|
|||
* - active: boolean, signals if the user is on this navigation entry
|
||||
*/
|
||||
public static function getNavigation() {
|
||||
$navigation = self::proceedNavigation( self::$navigation );
|
||||
$entries = OC::$server->getNavigationManager()->getAll();
|
||||
$navigation = self::proceedNavigation( $entries );
|
||||
return $navigation;
|
||||
}
|
||||
|
||||
|
|
|
@ -0,0 +1,98 @@
|
|||
<?php
|
||||
|
||||
/**
|
||||
* ownCloud - App Framework
|
||||
*
|
||||
* @author Bernhard Posselt
|
||||
* @copyright 2012 Bernhard Posselt nukeawhale@gmail.com
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 3 of the License, or any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU AFFERO GENERAL PUBLIC LICENSE for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public
|
||||
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
*/
|
||||
|
||||
|
||||
namespace OC\AppFramework;
|
||||
|
||||
use OC\AppFramework\DependencyInjection\DIContainer;
|
||||
use OCP\AppFramework\IAppContainer;
|
||||
|
||||
|
||||
/**
|
||||
* Entry point for every request in your app. You can consider this as your
|
||||
* public static void main() method
|
||||
*
|
||||
* Handles all the dependency injection, controllers and output flow
|
||||
*/
|
||||
class App {
|
||||
|
||||
|
||||
/**
|
||||
* Shortcut for calling a controller method and printing the result
|
||||
* @param string $controllerName the name of the controller under which it is
|
||||
* stored in the DI container
|
||||
* @param string $methodName the method that you want to call
|
||||
* @param array $urlParams an array with variables extracted from the routes
|
||||
* @param DIContainer $container an instance of a pimple container.
|
||||
*/
|
||||
public static function main($controllerName, $methodName, array $urlParams,
|
||||
IAppContainer $container) {
|
||||
$container['urlParams'] = $urlParams;
|
||||
$controller = $container[$controllerName];
|
||||
|
||||
// initialize the dispatcher and run all the middleware before the controller
|
||||
$dispatcher = $container['Dispatcher'];
|
||||
|
||||
list($httpHeaders, $responseHeaders, $output) =
|
||||
$dispatcher->dispatch($controller, $methodName);
|
||||
|
||||
if(!is_null($httpHeaders)) {
|
||||
header($httpHeaders);
|
||||
}
|
||||
|
||||
foreach($responseHeaders as $name => $value) {
|
||||
header($name . ': ' . $value);
|
||||
}
|
||||
|
||||
if(!is_null($output)) {
|
||||
header('Content-Length: ' . strlen($output));
|
||||
print($output);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Shortcut for calling a controller method and printing the result.
|
||||
* Similar to App:main except that no headers will be sent.
|
||||
* This should be used for example when registering sections via
|
||||
* \OC\AppFramework\Core\API::registerAdmin()
|
||||
*
|
||||
* @param string $controllerName the name of the controller under which it is
|
||||
* stored in the DI container
|
||||
* @param string $methodName the method that you want to call
|
||||
* @param array $urlParams an array with variables extracted from the routes
|
||||
* @param DIContainer $container an instance of a pimple container.
|
||||
*/
|
||||
public static function part($controllerName, $methodName, array $urlParams,
|
||||
DIContainer $container){
|
||||
|
||||
$container['urlParams'] = $urlParams;
|
||||
$controller = $container[$controllerName];
|
||||
|
||||
$dispatcher = $container['Dispatcher'];
|
||||
|
||||
list(, , $output) = $dispatcher->dispatch($controller, $methodName);
|
||||
return $output;
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,142 @@
|
|||
<?php
|
||||
|
||||
/**
|
||||
* ownCloud - App Framework
|
||||
*
|
||||
* @author Bernhard Posselt
|
||||
* @copyright 2012 Bernhard Posselt nukeawhale@gmail.com
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 3 of the License, or any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU AFFERO GENERAL PUBLIC LICENSE for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public
|
||||
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
*/
|
||||
|
||||
|
||||
namespace OC\AppFramework\Controller;
|
||||
|
||||
use OC\AppFramework\Http\Request;
|
||||
use OC\AppFramework\Core\API;
|
||||
use OCP\AppFramework\Http\TemplateResponse;
|
||||
|
||||
|
||||
/**
|
||||
* Base class to inherit your controllers from
|
||||
*/
|
||||
abstract class Controller {
|
||||
|
||||
/**
|
||||
* @var API instance of the api layer
|
||||
*/
|
||||
protected $api;
|
||||
|
||||
protected $request;
|
||||
|
||||
/**
|
||||
* @param API $api an api wrapper instance
|
||||
* @param Request $request an instance of the request
|
||||
*/
|
||||
public function __construct(API $api, Request $request){
|
||||
$this->api = $api;
|
||||
$this->request = $request;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Lets you access post and get parameters by the index
|
||||
* @param string $key the key which you want to access in the URL Parameter
|
||||
* placeholder, $_POST or $_GET array.
|
||||
* The priority how they're returned is the following:
|
||||
* 1. URL parameters
|
||||
* 2. POST parameters
|
||||
* 3. GET parameters
|
||||
* @param mixed $default If the key is not found, this value will be returned
|
||||
* @return mixed the content of the array
|
||||
*/
|
||||
public function params($key, $default=null){
|
||||
return $this->request->getParam($key, $default);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Returns all params that were received, be it from the request
|
||||
* (as GET or POST) or throuh the URL by the route
|
||||
* @return array the array with all parameters
|
||||
*/
|
||||
public function getParams() {
|
||||
return $this->request->getParams();
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Returns the method of the request
|
||||
* @return string the method of the request (POST, GET, etc)
|
||||
*/
|
||||
public function method() {
|
||||
return $this->request->getMethod();
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Shortcut for accessing an uploaded file through the $_FILES array
|
||||
* @param string $key the key that will be taken from the $_FILES array
|
||||
* @return array the file in the $_FILES element
|
||||
*/
|
||||
public function getUploadedFile($key) {
|
||||
return $this->request->getUploadedFile($key);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Shortcut for getting env variables
|
||||
* @param string $key the key that will be taken from the $_ENV array
|
||||
* @return array the value in the $_ENV element
|
||||
*/
|
||||
public function env($key) {
|
||||
return $this->request->getEnv($key);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Shortcut for getting cookie variables
|
||||
* @param string $key the key that will be taken from the $_COOKIE array
|
||||
* @return array the value in the $_COOKIE element
|
||||
*/
|
||||
public function cookie($key) {
|
||||
return $this->request->getCookie($key);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Shortcut for rendering a template
|
||||
* @param string $templateName the name of the template
|
||||
* @param array $params the template parameters in key => value structure
|
||||
* @param string $renderAs user renders a full page, blank only your template
|
||||
* admin an entry in the admin settings
|
||||
* @param array $headers set additional headers in name/value pairs
|
||||
* @return \OCP\AppFramework\Http\TemplateResponse containing the page
|
||||
*/
|
||||
public function render($templateName, array $params=array(),
|
||||
$renderAs='user', array $headers=array()){
|
||||
$response = new TemplateResponse($this->api, $templateName);
|
||||
$response->setParams($params);
|
||||
$response->renderAs($renderAs);
|
||||
|
||||
foreach($headers as $name => $value){
|
||||
$response->addHeader($name, $value);
|
||||
}
|
||||
|
||||
return $response;
|
||||
}
|
||||
|
||||
|
||||
}
|
|
@ -0,0 +1,348 @@
|
|||
<?php
|
||||
|
||||
/**
|
||||
* ownCloud - App Framework
|
||||
*
|
||||
* @author Bernhard Posselt
|
||||
* @copyright 2012 Bernhard Posselt nukeawhale@gmail.com
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 3 of the License, or any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU AFFERO GENERAL PUBLIC LICENSE for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public
|
||||
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
*/
|
||||
|
||||
|
||||
namespace OC\AppFramework\Core;
|
||||
use OCP\AppFramework\IApi;
|
||||
|
||||
|
||||
/**
|
||||
* This is used to wrap the owncloud static api calls into an object to make the
|
||||
* code better abstractable for use in the dependency injection container
|
||||
*
|
||||
* Should you find yourself in need for more methods, simply inherit from this
|
||||
* class and add your methods
|
||||
*/
|
||||
class API implements IApi{
|
||||
|
||||
private $appName;
|
||||
|
||||
/**
|
||||
* constructor
|
||||
* @param string $appName the name of your application
|
||||
*/
|
||||
public function __construct($appName){
|
||||
$this->appName = $appName;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Gets the userid of the current user
|
||||
* @return string the user id of the current user
|
||||
*/
|
||||
public function getUserId(){
|
||||
return \OCP\User::getUser();
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Adds a new javascript file
|
||||
* @param string $scriptName the name of the javascript in js/ without the suffix
|
||||
* @param string $appName the name of the app, defaults to the current one
|
||||
*/
|
||||
public function addScript($scriptName, $appName=null){
|
||||
if($appName === null){
|
||||
$appName = $this->appName;
|
||||
}
|
||||
\OCP\Util::addScript($appName, $scriptName);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Adds a new css file
|
||||
* @param string $styleName the name of the css file in css/without the suffix
|
||||
* @param string $appName the name of the app, defaults to the current one
|
||||
*/
|
||||
public function addStyle($styleName, $appName=null){
|
||||
if($appName === null){
|
||||
$appName = $this->appName;
|
||||
}
|
||||
\OCP\Util::addStyle($appName, $styleName);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* shorthand for addScript for files in the 3rdparty directory
|
||||
* @param string $name the name of the file without the suffix
|
||||
*/
|
||||
public function add3rdPartyScript($name){
|
||||
\OCP\Util::addScript($this->appName . '/3rdparty', $name);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* shorthand for addStyle for files in the 3rdparty directory
|
||||
* @param string $name the name of the file without the suffix
|
||||
*/
|
||||
public function add3rdPartyStyle($name){
|
||||
\OCP\Util::addStyle($this->appName . '/3rdparty', $name);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Returns the translation object
|
||||
* @return \OC_L10N the translation object
|
||||
*/
|
||||
public function getTrans(){
|
||||
# TODO: use public api
|
||||
return \OC_L10N::get($this->appName);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Returns the URL for a route
|
||||
* @param string $routeName the name of the route
|
||||
* @param array $arguments an array with arguments which will be filled into the url
|
||||
* @return string the url
|
||||
*/
|
||||
public function linkToRoute($routeName, $arguments=array()){
|
||||
return \OCP\Util::linkToRoute($routeName, $arguments);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Returns an URL for an image or file
|
||||
* @param string $file the name of the file
|
||||
* @param string $appName the name of the app, defaults to the current one
|
||||
*/
|
||||
public function linkTo($file, $appName=null){
|
||||
if($appName === null){
|
||||
$appName = $this->appName;
|
||||
}
|
||||
return \OCP\Util::linkTo($appName, $file);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Returns the link to an image, like link to but only with prepending img/
|
||||
* @param string $file the name of the file
|
||||
* @param string $appName the name of the app, defaults to the current one
|
||||
*/
|
||||
public function imagePath($file, $appName=null){
|
||||
if($appName === null){
|
||||
$appName = $this->appName;
|
||||
}
|
||||
return \OCP\Util::imagePath($appName, $file);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Makes an URL absolute
|
||||
* @param string $url the url
|
||||
* @return string the absolute url
|
||||
*/
|
||||
public function getAbsoluteURL($url){
|
||||
# TODO: use public api
|
||||
return \OC_Helper::makeURLAbsolute($url);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* links to a file
|
||||
* @param string $file the name of the file
|
||||
* @param string $appName the name of the app, defaults to the current one
|
||||
* @deprecated replaced with linkToRoute()
|
||||
* @return string the url
|
||||
*/
|
||||
public function linkToAbsolute($file, $appName=null){
|
||||
if($appName === null){
|
||||
$appName = $this->appName;
|
||||
}
|
||||
return \OCP\Util::linkToAbsolute($appName, $file);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Checks if the CSRF check was correct
|
||||
* @return bool true if CSRF check passed
|
||||
*/
|
||||
public function passesCSRFCheck(){
|
||||
# TODO: use public api
|
||||
return \OC_Util::isCallRegistered();
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Checks if an app is enabled
|
||||
* @param string $appName the name of an app
|
||||
* @return bool true if app is enabled
|
||||
*/
|
||||
public function isAppEnabled($appName){
|
||||
return \OCP\App::isEnabled($appName);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Writes a function into the error log
|
||||
* @param string $msg the error message to be logged
|
||||
* @param int $level the error level
|
||||
*/
|
||||
public function log($msg, $level=null){
|
||||
switch($level){
|
||||
case 'debug':
|
||||
$level = \OCP\Util::DEBUG;
|
||||
break;
|
||||
case 'info':
|
||||
$level = \OCP\Util::INFO;
|
||||
break;
|
||||
case 'warn':
|
||||
$level = \OCP\Util::WARN;
|
||||
break;
|
||||
case 'fatal':
|
||||
$level = \OCP\Util::FATAL;
|
||||
break;
|
||||
default:
|
||||
$level = \OCP\Util::ERROR;
|
||||
break;
|
||||
}
|
||||
\OCP\Util::writeLog($this->appName, $msg, $level);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* turns an owncloud path into a path on the filesystem
|
||||
* @param string path the path to the file on the oc filesystem
|
||||
* @return string the filepath in the filesystem
|
||||
*/
|
||||
public function getLocalFilePath($path){
|
||||
# TODO: use public api
|
||||
return \OC_Filesystem::getLocalFile($path);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* used to return and open a new eventsource
|
||||
* @return \OC_EventSource a new open EventSource class
|
||||
*/
|
||||
public function openEventSource(){
|
||||
# TODO: use public api
|
||||
return new \OC_EventSource();
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief connects a function to a hook
|
||||
* @param string $signalClass class name of emitter
|
||||
* @param string $signalName name of signal
|
||||
* @param string $slotClass class name of slot
|
||||
* @param string $slotName name of slot, in another word, this is the
|
||||
* name of the method that will be called when registered
|
||||
* signal is emitted.
|
||||
* @return bool, always true
|
||||
*/
|
||||
public function connectHook($signalClass, $signalName, $slotClass, $slotName) {
|
||||
return \OCP\Util::connectHook($signalClass, $signalName, $slotClass, $slotName);
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Emits a signal. To get data from the slot use references!
|
||||
* @param string $signalClass class name of emitter
|
||||
* @param string $signalName name of signal
|
||||
* @param array $params defautl: array() array with additional data
|
||||
* @return bool, true if slots exists or false if not
|
||||
*/
|
||||
public function emitHook($signalClass, $signalName, $params = array()) {
|
||||
return \OCP\Util::emitHook($signalClass, $signalName, $params);
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief clear hooks
|
||||
* @param string $signalClass
|
||||
* @param string $signalName
|
||||
*/
|
||||
public function clearHook($signalClass=false, $signalName=false) {
|
||||
if ($signalClass) {
|
||||
\OC_Hook::clear($signalClass, $signalName);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the content of an URL by using CURL or a fallback if it is not
|
||||
* installed
|
||||
* @param string $url the url that should be fetched
|
||||
* @return string the content of the webpage
|
||||
*/
|
||||
public function getUrlContent($url) {
|
||||
return \OC_Util::getUrlContent($url);
|
||||
}
|
||||
|
||||
/**
|
||||
* Register a backgroundjob task
|
||||
* @param string $className full namespace and class name of the class
|
||||
* @param string $methodName the name of the static method that should be
|
||||
* called
|
||||
*/
|
||||
public function addRegularTask($className, $methodName) {
|
||||
\OCP\Backgroundjob::addRegularTask($className, $methodName);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns a template
|
||||
* @param string $templateName the name of the template
|
||||
* @param string $renderAs how it should be rendered
|
||||
* @param string $appName the name of the app
|
||||
* @return \OCP\Template a new template
|
||||
*/
|
||||
public function getTemplate($templateName, $renderAs='user', $appName=null){
|
||||
if($appName === null){
|
||||
$appName = $this->appName;
|
||||
}
|
||||
|
||||
if($renderAs === 'blank'){
|
||||
return new \OCP\Template($appName, $templateName);
|
||||
} else {
|
||||
return new \OCP\Template($appName, $templateName, $renderAs);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Tells ownCloud to include a template in the admin overview
|
||||
* @param string $mainPath the path to the main php file without the php
|
||||
* suffix, relative to your apps directory! not the template directory
|
||||
* @param string $appName the name of the app, defaults to the current one
|
||||
*/
|
||||
public function registerAdmin($mainPath, $appName=null) {
|
||||
if($appName === null){
|
||||
$appName = $this->appName;
|
||||
}
|
||||
|
||||
\OCP\App::registerAdmin($appName, $mainPath);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* get the filesystem info
|
||||
*
|
||||
* @param string $path
|
||||
* @return array with the following keys:
|
||||
* - size
|
||||
* - mtime
|
||||
* - mimetype
|
||||
* - encrypted
|
||||
* - versioned
|
||||
*/
|
||||
public function getFileInfo($path) {
|
||||
return \OC\Files\Filesystem::getFileInfo($path);
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,146 @@
|
|||
<?php
|
||||
|
||||
/**
|
||||
* ownCloud - App Framework
|
||||
*
|
||||
* @author Bernhard Posselt
|
||||
* @copyright 2012 Bernhard Posselt nukeawhale@gmail.com
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 3 of the License, or any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU AFFERO GENERAL PUBLIC LICENSE for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public
|
||||
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
*/
|
||||
|
||||
|
||||
namespace OC\AppFramework\DependencyInjection;
|
||||
|
||||
use OC\AppFramework\Http\Http;
|
||||
use OC\AppFramework\Http\Request;
|
||||
use OC\AppFramework\Http\Dispatcher;
|
||||
use OC\AppFramework\Core\API;
|
||||
use OC\AppFramework\Middleware\MiddlewareDispatcher;
|
||||
use OC\AppFramework\Middleware\Security\SecurityMiddleware;
|
||||
use OC\AppFramework\Utility\SimpleContainer;
|
||||
use OC\AppFramework\Utility\TimeFactory;
|
||||
use OCP\AppFramework\IApi;
|
||||
use OCP\AppFramework\IAppContainer;
|
||||
use OCP\AppFramework\IMiddleWare;
|
||||
use OCP\IServerContainer;
|
||||
|
||||
|
||||
class DIContainer extends SimpleContainer implements IAppContainer{
|
||||
|
||||
/**
|
||||
* @var array
|
||||
*/
|
||||
private $middleWares = array();
|
||||
|
||||
/**
|
||||
* Put your class dependencies in here
|
||||
* @param string $appName the name of the app
|
||||
*/
|
||||
public function __construct($appName){
|
||||
|
||||
$this['AppName'] = $appName;
|
||||
|
||||
$this->registerParameter('ServerContainer', \OC::$server);
|
||||
|
||||
$this['API'] = $this->share(function($c){
|
||||
return new API($c['AppName']);
|
||||
});
|
||||
|
||||
/**
|
||||
* Http
|
||||
*/
|
||||
$this['Request'] = $this->share(function($c) {
|
||||
/** @var $c SimpleContainer */
|
||||
/** @var $server IServerContainer */
|
||||
$server = $c->query('ServerContainer');
|
||||
return $server->getRequest();
|
||||
});
|
||||
|
||||
$this['Protocol'] = $this->share(function($c){
|
||||
if(isset($_SERVER['SERVER_PROTOCOL'])) {
|
||||
return new Http($_SERVER, $_SERVER['SERVER_PROTOCOL']);
|
||||
} else {
|
||||
return new Http($_SERVER);
|
||||
}
|
||||
});
|
||||
|
||||
$this['Dispatcher'] = $this->share(function($c) {
|
||||
return new Dispatcher($c['Protocol'], $c['MiddlewareDispatcher']);
|
||||
});
|
||||
|
||||
|
||||
/**
|
||||
* Middleware
|
||||
*/
|
||||
$this['SecurityMiddleware'] = $this->share(function($c){
|
||||
return new SecurityMiddleware($c['API'], $c['Request']);
|
||||
});
|
||||
|
||||
$this['MiddlewareDispatcher'] = $this->share(function($c){
|
||||
$dispatcher = new MiddlewareDispatcher();
|
||||
$dispatcher->registerMiddleware($c['SecurityMiddleware']);
|
||||
|
||||
foreach($this->middleWares as $middleWare) {
|
||||
$dispatcher->registerMiddleware($middleWare);
|
||||
}
|
||||
|
||||
return $dispatcher;
|
||||
});
|
||||
|
||||
|
||||
/**
|
||||
* Utilities
|
||||
*/
|
||||
$this['TimeFactory'] = $this->share(function($c){
|
||||
return new TimeFactory();
|
||||
});
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @return IApi
|
||||
*/
|
||||
function getCoreApi()
|
||||
{
|
||||
return $this->query('API');
|
||||
}
|
||||
|
||||
/**
|
||||
* @return \OCP\IServerContainer
|
||||
*/
|
||||
function getServer()
|
||||
{
|
||||
return $this->query('ServerContainer');
|
||||
}
|
||||
|
||||
/**
|
||||
* @param IMiddleWare $middleWare
|
||||
* @return boolean
|
||||
*/
|
||||
function registerMiddleWare(IMiddleWare $middleWare) {
|
||||
array_push($this->middleWares, $middleWare);
|
||||
}
|
||||
|
||||
/**
|
||||
* used to return the appname of the set application
|
||||
* @return string the name of your application
|
||||
*/
|
||||
function getAppName() {
|
||||
return $this->query('AppName');
|
||||
}
|
||||
}
|
|
@ -0,0 +1,100 @@
|
|||
<?php
|
||||
|
||||
/**
|
||||
* ownCloud - App Framework
|
||||
*
|
||||
* @author Bernhard Posselt, Thomas Tanghus, Bart Visscher
|
||||
* @copyright 2012 Bernhard Posselt nukeawhale@gmail.com
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 3 of the License, or any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU AFFERO GENERAL PUBLIC LICENSE for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public
|
||||
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
*/
|
||||
|
||||
|
||||
namespace OC\AppFramework\Http;
|
||||
|
||||
use \OC\AppFramework\Controller\Controller;
|
||||
use \OC\AppFramework\Middleware\MiddlewareDispatcher;
|
||||
|
||||
|
||||
/**
|
||||
* Class to dispatch the request to the middleware dispatcher
|
||||
*/
|
||||
class Dispatcher {
|
||||
|
||||
private $middlewareDispatcher;
|
||||
private $protocol;
|
||||
|
||||
|
||||
/**
|
||||
* @param Http $protocol the http protocol with contains all status headers
|
||||
* @param MiddlewareDispatcher $middlewareDispatcher the dispatcher which
|
||||
* runs the middleware
|
||||
*/
|
||||
public function __construct(Http $protocol,
|
||||
MiddlewareDispatcher $middlewareDispatcher) {
|
||||
$this->protocol = $protocol;
|
||||
$this->middlewareDispatcher = $middlewareDispatcher;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Handles a request and calls the dispatcher on the controller
|
||||
* @param Controller $controller the controller which will be called
|
||||
* @param string $methodName the method name which will be called on
|
||||
* the controller
|
||||
* @return array $array[0] contains a string with the http main header,
|
||||
* $array[1] contains headers in the form: $key => value, $array[2] contains
|
||||
* the response output
|
||||
*/
|
||||
public function dispatch(Controller $controller, $methodName) {
|
||||
$out = array(null, array(), null);
|
||||
|
||||
try {
|
||||
|
||||
$this->middlewareDispatcher->beforeController($controller,
|
||||
$methodName);
|
||||
$response = $controller->$methodName();
|
||||
|
||||
// if an exception appears, the middleware checks if it can handle the
|
||||
// exception and creates a response. If no response is created, it is
|
||||
// assumed that theres no middleware who can handle it and the error is
|
||||
// thrown again
|
||||
} catch(\Exception $exception){
|
||||
$response = $this->middlewareDispatcher->afterException(
|
||||
$controller, $methodName, $exception);
|
||||
if (is_null($response)) {
|
||||
throw $exception;
|
||||
}
|
||||
}
|
||||
|
||||
$response = $this->middlewareDispatcher->afterController(
|
||||
$controller, $methodName, $response);
|
||||
|
||||
// get the output which should be printed and run the after output
|
||||
// middleware to modify the response
|
||||
$output = $response->render();
|
||||
$out[2] = $this->middlewareDispatcher->beforeOutput(
|
||||
$controller, $methodName, $output);
|
||||
|
||||
// depending on the cache object the headers need to be changed
|
||||
$out[0] = $this->protocol->getStatusHeader($response->getStatus(),
|
||||
$response->getLastModified(), $response->getETag());
|
||||
$out[1] = $response->getHeaders();
|
||||
|
||||
return $out;
|
||||
}
|
||||
|
||||
|
||||
}
|
|
@ -0,0 +1,50 @@
|
|||
<?php
|
||||
|
||||
/**
|
||||
* ownCloud - App Framework
|
||||
*
|
||||
* @author Bernhard Posselt
|
||||
* @copyright 2012 Bernhard Posselt nukeawhale@gmail.com
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 3 of the License, or any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU AFFERO GENERAL PUBLIC LICENSE for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public
|
||||
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
*/
|
||||
|
||||
|
||||
namespace OC\AppFramework\Http;
|
||||
|
||||
|
||||
/**
|
||||
* Prompts the user to download the a file
|
||||
*/
|
||||
class DownloadResponse extends \OCP\AppFramework\Http\Response {
|
||||
|
||||
private $filename;
|
||||
private $contentType;
|
||||
|
||||
/**
|
||||
* Creates a response that prompts the user to download the file
|
||||
* @param string $filename the name that the downloaded file should have
|
||||
* @param string $contentType the mimetype that the downloaded file should have
|
||||
*/
|
||||
public function __construct($filename, $contentType) {
|
||||
$this->filename = $filename;
|
||||
$this->contentType = $contentType;
|
||||
|
||||
$this->addHeader('Content-Disposition', 'attachment; filename="' . $filename . '"');
|
||||
$this->addHeader('Content-Type', $contentType);
|
||||
}
|
||||
|
||||
|
||||
}
|
|
@ -0,0 +1,148 @@
|
|||
<?php
|
||||
|
||||
/**
|
||||
* ownCloud - App Framework
|
||||
*
|
||||
* @author Bernhard Posselt, Thomas Tanghus, Bart Visscher
|
||||
* @copyright 2012 Bernhard Posselt nukeawhale@gmail.com
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 3 of the License, or any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU AFFERO GENERAL PUBLIC LICENSE for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public
|
||||
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
*/
|
||||
|
||||
|
||||
namespace OC\AppFramework\Http;
|
||||
|
||||
|
||||
class Http extends \OCP\AppFramework\Http\Http{
|
||||
|
||||
private $server;
|
||||
private $protocolVersion;
|
||||
protected $headers;
|
||||
|
||||
/**
|
||||
* @param $_SERVER $server
|
||||
* @param string $protocolVersion the http version to use defaults to HTTP/1.1
|
||||
*/
|
||||
public function __construct($server, $protocolVersion='HTTP/1.1') {
|
||||
$this->server = $server;
|
||||
$this->protocolVersion = $protocolVersion;
|
||||
|
||||
$this->headers = array(
|
||||
self::STATUS_CONTINUE => 'Continue',
|
||||
self::STATUS_SWITCHING_PROTOCOLS => 'Switching Protocols',
|
||||
self::STATUS_PROCESSING => 'Processing',
|
||||
self::STATUS_OK => 'OK',
|
||||
self::STATUS_CREATED => 'Created',
|
||||
self::STATUS_ACCEPTED => 'Accepted',
|
||||
self::STATUS_NON_AUTHORATIVE_INFORMATION => 'Non-Authorative Information',
|
||||
self::STATUS_NO_CONTENT => 'No Content',
|
||||
self::STATUS_RESET_CONTENT => 'Reset Content',
|
||||
self::STATUS_PARTIAL_CONTENT => 'Partial Content',
|
||||
self::STATUS_MULTI_STATUS => 'Multi-Status', // RFC 4918
|
||||
self::STATUS_ALREADY_REPORTED => 'Already Reported', // RFC 5842
|
||||
self::STATUS_IM_USED => 'IM Used', // RFC 3229
|
||||
self::STATUS_MULTIPLE_CHOICES => 'Multiple Choices',
|
||||
self::STATUS_MOVED_PERMANENTLY => 'Moved Permanently',
|
||||
self::STATUS_FOUND => 'Found',
|
||||
self::STATUS_SEE_OTHER => 'See Other',
|
||||
self::STATUS_NOT_MODIFIED => 'Not Modified',
|
||||
self::STATUS_USE_PROXY => 'Use Proxy',
|
||||
self::STATUS_RESERVED => 'Reserved',
|
||||
self::STATUS_TEMPORARY_REDIRECT => 'Temporary Redirect',
|
||||
self::STATUS_BAD_REQUEST => 'Bad request',
|
||||
self::STATUS_UNAUTHORIZED => 'Unauthorized',
|
||||
self::STATUS_PAYMENT_REQUIRED => 'Payment Required',
|
||||
self::STATUS_FORBIDDEN => 'Forbidden',
|
||||
self::STATUS_NOT_FOUND => 'Not Found',
|
||||
self::STATUS_METHOD_NOT_ALLOWED => 'Method Not Allowed',
|
||||
self::STATUS_NOT_ACCEPTABLE => 'Not Acceptable',
|
||||
self::STATUS_PROXY_AUTHENTICATION_REQUIRED => 'Proxy Authentication Required',
|
||||
self::STATUS_REQUEST_TIMEOUT => 'Request Timeout',
|
||||
self::STATUS_CONFLICT => 'Conflict',
|
||||
self::STATUS_GONE => 'Gone',
|
||||
self::STATUS_LENGTH_REQUIRED => 'Length Required',
|
||||
self::STATUS_PRECONDITION_FAILED => 'Precondition failed',
|
||||
self::STATUS_REQUEST_ENTITY_TOO_LARGE => 'Request Entity Too Large',
|
||||
self::STATUS_REQUEST_URI_TOO_LONG => 'Request-URI Too Long',
|
||||
self::STATUS_UNSUPPORTED_MEDIA_TYPE => 'Unsupported Media Type',
|
||||
self::STATUS_REQUEST_RANGE_NOT_SATISFIABLE => 'Requested Range Not Satisfiable',
|
||||
self::STATUS_EXPECTATION_FAILED => 'Expectation Failed',
|
||||
self::STATUS_IM_A_TEAPOT => 'I\'m a teapot', // RFC 2324
|
||||
self::STATUS_UNPROCESSABLE_ENTITY => 'Unprocessable Entity', // RFC 4918
|
||||
self::STATUS_LOCKED => 'Locked', // RFC 4918
|
||||
self::STATUS_FAILED_DEPENDENCY => 'Failed Dependency', // RFC 4918
|
||||
self::STATUS_UPGRADE_REQUIRED => 'Upgrade required',
|
||||
self::STATUS_PRECONDITION_REQUIRED => 'Precondition required', // draft-nottingham-http-new-status
|
||||
self::STATUS_TOO_MANY_REQUESTS => 'Too Many Requests', // draft-nottingham-http-new-status
|
||||
self::STATUS_REQUEST_HEADER_FIELDS_TOO_LARGE => 'Request Header Fields Too Large', // draft-nottingham-http-new-status
|
||||
self::STATUS_INTERNAL_SERVER_ERROR => 'Internal Server Error',
|
||||
self::STATUS_NOT_IMPLEMENTED => 'Not Implemented',
|
||||
self::STATUS_BAD_GATEWAY => 'Bad Gateway',
|
||||
self::STATUS_SERVICE_UNAVAILABLE => 'Service Unavailable',
|
||||
self::STATUS_GATEWAY_TIMEOUT => 'Gateway Timeout',
|
||||
self::STATUS_HTTP_VERSION_NOT_SUPPORTED => 'HTTP Version not supported',
|
||||
self::STATUS_VARIANT_ALSO_NEGOTIATES => 'Variant Also Negotiates',
|
||||
self::STATUS_INSUFFICIENT_STORAGE => 'Insufficient Storage', // RFC 4918
|
||||
self::STATUS_LOOP_DETECTED => 'Loop Detected', // RFC 5842
|
||||
self::STATUS_BANDWIDTH_LIMIT_EXCEEDED => 'Bandwidth Limit Exceeded', // non-standard
|
||||
self::STATUS_NOT_EXTENDED => 'Not extended',
|
||||
self::STATUS_NETWORK_AUTHENTICATION_REQUIRED => 'Network Authentication Required', // draft-nottingham-http-new-status
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Gets the correct header
|
||||
* @param Http::CONSTANT $status the constant from the Http class
|
||||
* @param \DateTime $lastModified formatted last modified date
|
||||
* @param string $Etag the etag
|
||||
*/
|
||||
public function getStatusHeader($status, \DateTime $lastModified=null,
|
||||
$ETag=null) {
|
||||
|
||||
if(!is_null($lastModified)) {
|
||||
$lastModified = $lastModified->format(\DateTime::RFC2822);
|
||||
}
|
||||
|
||||
// if etag or lastmodified have not changed, return a not modified
|
||||
if ((isset($this->server['HTTP_IF_NONE_MATCH'])
|
||||
&& trim($this->server['HTTP_IF_NONE_MATCH']) === $ETag)
|
||||
|
||||
||
|
||||
|
||||
(isset($this->server['HTTP_IF_MODIFIED_SINCE'])
|
||||
&& trim($this->server['HTTP_IF_MODIFIED_SINCE']) ===
|
||||
$lastModified)) {
|
||||
|
||||
$status = self::STATUS_NOT_MODIFIED;
|
||||
}
|
||||
|
||||
// we have one change currently for the http 1.0 header that differs
|
||||
// from 1.1: STATUS_TEMPORARY_REDIRECT should be STATUS_FOUND
|
||||
// if this differs any more, we want to create childclasses for this
|
||||
if($status === self::STATUS_TEMPORARY_REDIRECT
|
||||
&& $this->protocolVersion === 'HTTP/1.0') {
|
||||
|
||||
$status = self::STATUS_FOUND;
|
||||
}
|
||||
|
||||
return $this->protocolVersion . ' ' . $status . ' ' .
|
||||
$this->headers[$status];
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
|
@ -0,0 +1,56 @@
|
|||
<?php
|
||||
|
||||
/**
|
||||
* ownCloud - App Framework
|
||||
*
|
||||
* @author Bernhard Posselt
|
||||
* @copyright 2012 Bernhard Posselt nukeawhale@gmail.com
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 3 of the License, or any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU AFFERO GENERAL PUBLIC LICENSE for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public
|
||||
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
*/
|
||||
|
||||
|
||||
namespace OC\AppFramework\Http;
|
||||
|
||||
use OCP\AppFramework\Http\Response;
|
||||
|
||||
|
||||
/**
|
||||
* Redirects to a different URL
|
||||
*/
|
||||
class RedirectResponse extends Response {
|
||||
|
||||
private $redirectURL;
|
||||
|
||||
/**
|
||||
* Creates a response that redirects to a url
|
||||
* @param string $redirectURL the url to redirect to
|
||||
*/
|
||||
public function __construct($redirectURL) {
|
||||
$this->redirectURL = $redirectURL;
|
||||
$this->setStatus(Http::STATUS_TEMPORARY_REDIRECT);
|
||||
$this->addHeader('Location', $redirectURL);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @return string the url to redirect
|
||||
*/
|
||||
public function getRedirectURL() {
|
||||
return $this->redirectURL;
|
||||
}
|
||||
|
||||
|
||||
}
|
|
@ -0,0 +1,307 @@
|
|||
<?php
|
||||
/**
|
||||
* ownCloud - Request
|
||||
*
|
||||
* @author Thomas Tanghus
|
||||
* @copyright 2013 Thomas Tanghus (thomas@tanghus.net)
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 3 of the License, or any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU AFFERO GENERAL PUBLIC LICENSE for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public
|
||||
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
*/
|
||||
|
||||
namespace OC\AppFramework\Http;
|
||||
|
||||
use OCP\IRequest;
|
||||
|
||||
/**
|
||||
* Class for accessing variables in the request.
|
||||
* This class provides an immutable object with request variables.
|
||||
*/
|
||||
|
||||
class Request implements \ArrayAccess, \Countable, IRequest {
|
||||
|
||||
protected $items = array();
|
||||
protected $allowedKeys = array(
|
||||
'get',
|
||||
'post',
|
||||
'files',
|
||||
'server',
|
||||
'env',
|
||||
'cookies',
|
||||
'urlParams',
|
||||
'params',
|
||||
'parameters',
|
||||
'method'
|
||||
);
|
||||
|
||||
/**
|
||||
* @param array $vars An associative array with the following optional values:
|
||||
* @param array 'params' the parsed json array
|
||||
* @param array 'urlParams' the parameters which were matched from the URL
|
||||
* @param array 'get' the $_GET array
|
||||
* @param array 'post' the $_POST array
|
||||
* @param array 'files' the $_FILES array
|
||||
* @param array 'server' the $_SERVER array
|
||||
* @param array 'env' the $_ENV array
|
||||
* @param array 'session' the $_SESSION array
|
||||
* @param array 'cookies' the $_COOKIE array
|
||||
* @param string 'method' the request method (GET, POST etc)
|
||||
* @see http://www.php.net/manual/en/reserved.variables.php
|
||||
*/
|
||||
public function __construct(array $vars=array()) {
|
||||
|
||||
foreach($this->allowedKeys as $name) {
|
||||
$this->items[$name] = isset($vars[$name])
|
||||
? $vars[$name]
|
||||
: array();
|
||||
}
|
||||
|
||||
$this->items['parameters'] = array_merge(
|
||||
$this->items['params'],
|
||||
$this->items['get'],
|
||||
$this->items['post'],
|
||||
$this->items['urlParams']
|
||||
);
|
||||
|
||||
}
|
||||
|
||||
// Countable method.
|
||||
public function count() {
|
||||
return count(array_keys($this->items['parameters']));
|
||||
}
|
||||
|
||||
/**
|
||||
* ArrayAccess methods
|
||||
*
|
||||
* Gives access to the combined GET, POST and urlParams arrays
|
||||
*
|
||||
* Examples:
|
||||
*
|
||||
* $var = $request['myvar'];
|
||||
*
|
||||
* or
|
||||
*
|
||||
* if(!isset($request['myvar']) {
|
||||
* // Do something
|
||||
* }
|
||||
*
|
||||
* $request['myvar'] = 'something'; // This throws an exception.
|
||||
*
|
||||
* @param string $offset The key to lookup
|
||||
* @return string|null
|
||||
*/
|
||||
public function offsetExists($offset) {
|
||||
return isset($this->items['parameters'][$offset]);
|
||||
}
|
||||
|
||||
/**
|
||||
* @see offsetExists
|
||||
*/
|
||||
public function offsetGet($offset) {
|
||||
return isset($this->items['parameters'][$offset])
|
||||
? $this->items['parameters'][$offset]
|
||||
: null;
|
||||
}
|
||||
|
||||
/**
|
||||
* @see offsetExists
|
||||
*/
|
||||
public function offsetSet($offset, $value) {
|
||||
throw new \RuntimeException('You cannot change the contents of the request object');
|
||||
}
|
||||
|
||||
/**
|
||||
* @see offsetExists
|
||||
*/
|
||||
public function offsetUnset($offset) {
|
||||
throw new \RuntimeException('You cannot change the contents of the request object');
|
||||
}
|
||||
|
||||
// Magic property accessors
|
||||
public function __set($name, $value) {
|
||||
throw new \RuntimeException('You cannot change the contents of the request object');
|
||||
}
|
||||
|
||||
/**
|
||||
* Access request variables by method and name.
|
||||
* Examples:
|
||||
*
|
||||
* $request->post['myvar']; // Only look for POST variables
|
||||
* $request->myvar; or $request->{'myvar'}; or $request->{$myvar}
|
||||
* Looks in the combined GET, POST and urlParams array.
|
||||
*
|
||||
* if($request->method !== 'POST') {
|
||||
* throw new Exception('This function can only be invoked using POST');
|
||||
* }
|
||||
*
|
||||
* @param string $name The key to look for.
|
||||
* @return mixed|null
|
||||
*/
|
||||
public function __get($name) {
|
||||
switch($name) {
|
||||
case 'get':
|
||||
case 'post':
|
||||
case 'files':
|
||||
case 'server':
|
||||
case 'env':
|
||||
case 'cookies':
|
||||
case 'parameters':
|
||||
case 'params':
|
||||
case 'urlParams':
|
||||
return isset($this->items[$name])
|
||||
? $this->items[$name]
|
||||
: null;
|
||||
break;
|
||||
case 'method':
|
||||
return $this->items['method'];
|
||||
break;
|
||||
default;
|
||||
return isset($this[$name])
|
||||
? $this[$name]
|
||||
: null;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public function __isset($name) {
|
||||
return isset($this->items['parameters'][$name]);
|
||||
}
|
||||
|
||||
|
||||
public function __unset($id) {
|
||||
throw new \RunTimeException('You cannot change the contents of the request object');
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the value for a specific http header.
|
||||
*
|
||||
* This method returns null if the header did not exist.
|
||||
*
|
||||
* @param string $name
|
||||
* @return string
|
||||
*/
|
||||
public function getHeader($name) {
|
||||
|
||||
$name = strtoupper(str_replace(array('-'),array('_'),$name));
|
||||
if (isset($this->server['HTTP_' . $name])) {
|
||||
return $this->server['HTTP_' . $name];
|
||||
}
|
||||
|
||||
// There's a few headers that seem to end up in the top-level
|
||||
// server array.
|
||||
switch($name) {
|
||||
case 'CONTENT_TYPE' :
|
||||
case 'CONTENT_LENGTH' :
|
||||
if (isset($this->server[$name])) {
|
||||
return $this->server[$name];
|
||||
}
|
||||
break;
|
||||
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Lets you access post and get parameters by the index
|
||||
* In case of json requests the encoded json body is accessed
|
||||
*
|
||||
* @param string $key the key which you want to access in the URL Parameter
|
||||
* placeholder, $_POST or $_GET array.
|
||||
* The priority how they're returned is the following:
|
||||
* 1. URL parameters
|
||||
* 2. POST parameters
|
||||
* 3. GET parameters
|
||||
* @param mixed $default If the key is not found, this value will be returned
|
||||
* @return mixed the content of the array
|
||||
*/
|
||||
public function getParam($key, $default = null) {
|
||||
return isset($this->parameters[$key])
|
||||
? $this->parameters[$key]
|
||||
: $default;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns all params that were received, be it from the request
|
||||
* (as GET or POST) or throuh the URL by the route
|
||||
* @return array the array with all parameters
|
||||
*/
|
||||
public function getParams() {
|
||||
return $this->parameters;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the method of the request
|
||||
* @return string the method of the request (POST, GET, etc)
|
||||
*/
|
||||
public function getMethod() {
|
||||
return $this->method;
|
||||
}
|
||||
|
||||
/**
|
||||
* Shortcut for accessing an uploaded file through the $_FILES array
|
||||
* @param string $key the key that will be taken from the $_FILES array
|
||||
* @return array the file in the $_FILES element
|
||||
*/
|
||||
public function getUploadedFile($key) {
|
||||
return isset($this->files[$key]) ? $this->files[$key] : null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Shortcut for getting env variables
|
||||
* @param string $key the key that will be taken from the $_ENV array
|
||||
* @return array the value in the $_ENV element
|
||||
*/
|
||||
public function getEnv($key) {
|
||||
return isset($this->env[$key]) ? $this->env[$key] : null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Shortcut for getting cookie variables
|
||||
* @param string $key the key that will be taken from the $_COOKIE array
|
||||
* @return array the value in the $_COOKIE element
|
||||
*/
|
||||
function getCookie($key) {
|
||||
return isset($this->cookies[$key]) ? $this->cookies[$key] : null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the request body content.
|
||||
*
|
||||
* @param Boolean $asResource If true, a resource will be returned
|
||||
*
|
||||
* @return string|resource The request body content or a resource to read the body stream.
|
||||
*
|
||||
* @throws \LogicException
|
||||
*/
|
||||
function getContent($asResource = false) {
|
||||
return null;
|
||||
// if (false === $this->content || (true === $asResource && null !== $this->content)) {
|
||||
// throw new \LogicException('getContent() can only be called once when using the resource return type.');
|
||||
// }
|
||||
//
|
||||
// if (true === $asResource) {
|
||||
// $this->content = false;
|
||||
//
|
||||
// return fopen('php://input', 'rb');
|
||||
// }
|
||||
//
|
||||
// if (null === $this->content) {
|
||||
// $this->content = file_get_contents('php://input');
|
||||
// }
|
||||
//
|
||||
// return $this->content;
|
||||
}
|
||||
}
|
|
@ -0,0 +1,100 @@
|
|||
<?php
|
||||
|
||||
/**
|
||||
* ownCloud - App Framework
|
||||
*
|
||||
* @author Bernhard Posselt
|
||||
* @copyright 2012 Bernhard Posselt nukeawhale@gmail.com
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 3 of the License, or any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU AFFERO GENERAL PUBLIC LICENSE for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public
|
||||
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
*/
|
||||
|
||||
|
||||
namespace OC\AppFramework\Middleware;
|
||||
|
||||
use OCP\AppFramework\Http\Response;
|
||||
|
||||
|
||||
/**
|
||||
* Middleware is used to provide hooks before or after controller methods and
|
||||
* deal with possible exceptions raised in the controller methods.
|
||||
* They're modeled after Django's middleware system:
|
||||
* https://docs.djangoproject.com/en/dev/topics/http/middleware/
|
||||
*/
|
||||
abstract class Middleware {
|
||||
|
||||
|
||||
/**
|
||||
* This is being run in normal order before the controller is being
|
||||
* called which allows several modifications and checks
|
||||
*
|
||||
* @param Controller $controller the controller that is being called
|
||||
* @param string $methodName the name of the method that will be called on
|
||||
* the controller
|
||||
*/
|
||||
public function beforeController($controller, $methodName){
|
||||
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* This is being run when either the beforeController method or the
|
||||
* controller method itself is throwing an exception. The middleware is
|
||||
* asked in reverse order to handle the exception and to return a response.
|
||||
* If the response is null, it is assumed that the exception could not be
|
||||
* handled and the error will be thrown again
|
||||
*
|
||||
* @param Controller $controller the controller that is being called
|
||||
* @param string $methodName the name of the method that will be called on
|
||||
* the controller
|
||||
* @param \Exception $exception the thrown exception
|
||||
* @throws \Exception the passed in exception if it cant handle it
|
||||
* @return Response a Response object in case that the exception was handled
|
||||
*/
|
||||
public function afterException($controller, $methodName, \Exception $exception){
|
||||
throw $exception;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* This is being run after a successful controllermethod call and allows
|
||||
* the manipulation of a Response object. The middleware is run in reverse order
|
||||
*
|
||||
* @param Controller $controller the controller that is being called
|
||||
* @param string $methodName the name of the method that will be called on
|
||||
* the controller
|
||||
* @param Response $response the generated response from the controller
|
||||
* @return Response a Response object
|
||||
*/
|
||||
public function afterController($controller, $methodName, Response $response){
|
||||
return $response;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* This is being run after the response object has been rendered and
|
||||
* allows the manipulation of the output. The middleware is run in reverse order
|
||||
*
|
||||
* @param Controller $controller the controller that is being called
|
||||
* @param string $methodName the name of the method that will be called on
|
||||
* the controller
|
||||
* @param string $output the generated output from a response
|
||||
* @return string the output that should be printed
|
||||
*/
|
||||
public function beforeOutput($controller, $methodName, $output){
|
||||
return $output;
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,159 @@
|
|||
<?php
|
||||
|
||||
/**
|
||||
* ownCloud - App Framework
|
||||
*
|
||||
* @author Bernhard Posselt
|
||||
* @copyright 2012 Bernhard Posselt nukeawhale@gmail.com
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 3 of the License, or any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU AFFERO GENERAL PUBLIC LICENSE for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public
|
||||
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
*/
|
||||
|
||||
|
||||
namespace OC\AppFramework\Middleware;
|
||||
|
||||
use OC\AppFramework\Controller\Controller;
|
||||
use OCP\AppFramework\Http\Response;
|
||||
|
||||
|
||||
/**
|
||||
* This class is used to store and run all the middleware in correct order
|
||||
*/
|
||||
class MiddlewareDispatcher {
|
||||
|
||||
/**
|
||||
* @var array array containing all the middlewares
|
||||
*/
|
||||
private $middlewares;
|
||||
|
||||
/**
|
||||
* @var int counter which tells us what middlware was executed once an
|
||||
* exception occurs
|
||||
*/
|
||||
private $middlewareCounter;
|
||||
|
||||
|
||||
/**
|
||||
* Constructor
|
||||
*/
|
||||
public function __construct(){
|
||||
$this->middlewares = array();
|
||||
$this->middlewareCounter = 0;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Adds a new middleware
|
||||
* @param Middleware $middleware the middleware which will be added
|
||||
*/
|
||||
public function registerMiddleware(Middleware $middleWare){
|
||||
array_push($this->middlewares, $middleWare);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* returns an array with all middleware elements
|
||||
* @return array the middlewares
|
||||
*/
|
||||
public function getMiddlewares(){
|
||||
return $this->middlewares;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* This is being run in normal order before the controller is being
|
||||
* called which allows several modifications and checks
|
||||
*
|
||||
* @param Controller $controller the controller that is being called
|
||||
* @param string $methodName the name of the method that will be called on
|
||||
* the controller
|
||||
*/
|
||||
public function beforeController(Controller $controller, $methodName){
|
||||
// we need to count so that we know which middlewares we have to ask in
|
||||
// case theres an exception
|
||||
for($i=0; $i<count($this->middlewares); $i++){
|
||||
$this->middlewareCounter++;
|
||||
$middleware = $this->middlewares[$i];
|
||||
$middleware->beforeController($controller, $methodName);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* This is being run when either the beforeController method or the
|
||||
* controller method itself is throwing an exception. The middleware is asked
|
||||
* in reverse order to handle the exception and to return a response.
|
||||
* If the response is null, it is assumed that the exception could not be
|
||||
* handled and the error will be thrown again
|
||||
*
|
||||
* @param Controller $controller the controller that is being called
|
||||
* @param string $methodName the name of the method that will be called on
|
||||
* the controller
|
||||
* @param \Exception $exception the thrown exception
|
||||
* @return Response a Response object if the middleware can handle the
|
||||
* exception
|
||||
* @throws \Exception the passed in exception if it cant handle it
|
||||
*/
|
||||
public function afterException(Controller $controller, $methodName, \Exception $exception){
|
||||
for($i=$this->middlewareCounter-1; $i>=0; $i--){
|
||||
$middleware = $this->middlewares[$i];
|
||||
try {
|
||||
return $middleware->afterException($controller, $methodName, $exception);
|
||||
} catch(\Exception $exception){
|
||||
continue;
|
||||
}
|
||||
}
|
||||
throw $exception;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* This is being run after a successful controllermethod call and allows
|
||||
* the manipulation of a Response object. The middleware is run in reverse order
|
||||
*
|
||||
* @param Controller $controller the controller that is being called
|
||||
* @param string $methodName the name of the method that will be called on
|
||||
* the controller
|
||||
* @param Response $response the generated response from the controller
|
||||
* @return Response a Response object
|
||||
*/
|
||||
public function afterController(Controller $controller, $methodName, Response $response){
|
||||
for($i=count($this->middlewares)-1; $i>=0; $i--){
|
||||
$middleware = $this->middlewares[$i];
|
||||
$response = $middleware->afterController($controller, $methodName, $response);
|
||||
}
|
||||
return $response;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* This is being run after the response object has been rendered and
|
||||
* allows the manipulation of the output. The middleware is run in reverse order
|
||||
*
|
||||
* @param Controller $controller the controller that is being called
|
||||
* @param string $methodName the name of the method that will be called on
|
||||
* the controller
|
||||
* @param string $output the generated output from a response
|
||||
* @return string the output that should be printed
|
||||
*/
|
||||
public function beforeOutput(Controller $controller, $methodName, $output){
|
||||
for($i=count($this->middlewares)-1; $i>=0; $i--){
|
||||
$middleware = $this->middlewares[$i];
|
||||
$output = $middleware->beforeOutput($controller, $methodName, $output);
|
||||
}
|
||||
return $output;
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,41 @@
|
|||
<?php
|
||||
|
||||
/**
|
||||
* ownCloud - App Framework
|
||||
*
|
||||
* @author Bernhard Posselt
|
||||
* @copyright 2012 Bernhard Posselt nukeawhale@gmail.com
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 3 of the License, or any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU AFFERO GENERAL PUBLIC LICENSE for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public
|
||||
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
*/
|
||||
|
||||
|
||||
namespace OC\AppFramework\Middleware\Security;
|
||||
|
||||
|
||||
/**
|
||||
* Thrown when the security middleware encounters a security problem
|
||||
*/
|
||||
class SecurityException extends \Exception {
|
||||
|
||||
/**
|
||||
* @param string $msg the security error message
|
||||
* @param bool $ajax true if it resulted because of an ajax request
|
||||
*/
|
||||
public function __construct($msg, $code = 0) {
|
||||
parent::__construct($msg, $code);
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,136 @@
|
|||
<?php
|
||||
|
||||
/**
|
||||
* ownCloud - App Framework
|
||||
*
|
||||
* @author Bernhard Posselt
|
||||
* @copyright 2012 Bernhard Posselt nukeawhale@gmail.com
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 3 of the License, or any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU AFFERO GENERAL PUBLIC LICENSE for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public
|
||||
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
*/
|
||||
|
||||
|
||||
namespace OC\AppFramework\Middleware\Security;
|
||||
|
||||
use OC\AppFramework\Controller\Controller;
|
||||
use OC\AppFramework\Http\Http;
|
||||
use OC\AppFramework\Http\Request;
|
||||
use OC\AppFramework\Http\RedirectResponse;
|
||||
use OC\AppFramework\Utility\MethodAnnotationReader;
|
||||
use OC\AppFramework\Middleware\Middleware;
|
||||
use OC\AppFramework\Core\API;
|
||||
use OCP\AppFramework\Http\Response;
|
||||
use OCP\AppFramework\Http\JSONResponse;
|
||||
|
||||
|
||||
/**
|
||||
* Used to do all the authentication and checking stuff for a controller method
|
||||
* It reads out the annotations of a controller method and checks which if
|
||||
* security things should be checked and also handles errors in case a security
|
||||
* check fails
|
||||
*/
|
||||
class SecurityMiddleware extends Middleware {
|
||||
|
||||
private $api;
|
||||
|
||||
/**
|
||||
* @var \OC\AppFramework\Http\Request
|
||||
*/
|
||||
private $request;
|
||||
|
||||
/**
|
||||
* @param API $api an instance of the api
|
||||
*/
|
||||
public function __construct(API $api, Request $request){
|
||||
$this->api = $api;
|
||||
$this->request = $request;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* This runs all the security checks before a method call. The
|
||||
* security checks are determined by inspecting the controller method
|
||||
* annotations
|
||||
* @param string/Controller $controller the controllername or string
|
||||
* @param string $methodName the name of the method
|
||||
* @throws SecurityException when a security check fails
|
||||
*/
|
||||
public function beforeController($controller, $methodName){
|
||||
|
||||
// get annotations from comments
|
||||
$annotationReader = new MethodAnnotationReader($controller, $methodName);
|
||||
|
||||
// this will set the current navigation entry of the app, use this only
|
||||
// for normal HTML requests and not for AJAX requests
|
||||
$this->api->activateNavigationEntry();
|
||||
|
||||
// security checks
|
||||
$isPublicPage = $annotationReader->hasAnnotation('PublicPage');
|
||||
if(!$isPublicPage) {
|
||||
if(!$this->api->isLoggedIn()) {
|
||||
throw new SecurityException('Current user is not logged in', Http::STATUS_UNAUTHORIZED);
|
||||
}
|
||||
|
||||
if(!$annotationReader->hasAnnotation('NoAdminRequired')) {
|
||||
if(!$this->api->isAdminUser($this->api->getUserId())) {
|
||||
throw new SecurityException('Logged in user must be an admin', Http::STATUS_FORBIDDEN);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if(!$annotationReader->hasAnnotation('NoCSRFRequired')) {
|
||||
if(!$this->api->passesCSRFCheck()) {
|
||||
throw new SecurityException('CSRF check failed', Http::STATUS_PRECONDITION_FAILED);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* If an SecurityException is being caught, ajax requests return a JSON error
|
||||
* response and non ajax requests redirect to the index
|
||||
* @param Controller $controller the controller that is being called
|
||||
* @param string $methodName the name of the method that will be called on
|
||||
* the controller
|
||||
* @param \Exception $exception the thrown exception
|
||||
* @throws \Exception the passed in exception if it cant handle it
|
||||
* @return Response a Response object or null in case that the exception could not be handled
|
||||
*/
|
||||
public function afterException($controller, $methodName, \Exception $exception){
|
||||
if($exception instanceof SecurityException){
|
||||
|
||||
if (stripos($this->request->getHeader('Accept'),'html')===false) {
|
||||
|
||||
$response = new JSONResponse(
|
||||
array('message' => $exception->getMessage()),
|
||||
$exception->getCode()
|
||||
);
|
||||
$this->api->log($exception->getMessage(), 'debug');
|
||||
} else {
|
||||
|
||||
$url = $this->api->linkToAbsolute('index.php', ''); // TODO: replace with link to route
|
||||
$response = new RedirectResponse($url);
|
||||
$this->api->log($exception->getMessage(), 'debug');
|
||||
}
|
||||
|
||||
return $response;
|
||||
|
||||
}
|
||||
|
||||
throw $exception;
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,42 @@
|
|||
<?php
|
||||
/**
|
||||
* ownCloud - App Framework
|
||||
*
|
||||
* @author Thomas Müller
|
||||
* @copyright 2013 Thomas Müller thomas.mueller@tmit.eu
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 3 of the License, or any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU AFFERO GENERAL PUBLIC LICENSE for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public
|
||||
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
*/
|
||||
|
||||
namespace OC\AppFramework\routing;
|
||||
|
||||
use \OC\AppFramework\App;
|
||||
use \OC\AppFramework\DependencyInjection\DIContainer;
|
||||
|
||||
class RouteActionHandler {
|
||||
private $controllerName;
|
||||
private $actionName;
|
||||
private $container;
|
||||
|
||||
public function __construct(DIContainer $container, $controllerName, $actionName) {
|
||||
$this->controllerName = $controllerName;
|
||||
$this->actionName = $actionName;
|
||||
$this->container = $container;
|
||||
}
|
||||
|
||||
public function __invoke($params) {
|
||||
App::main($this->controllerName, $this->actionName, $params, $this->container);
|
||||
}
|
||||
}
|
|
@ -0,0 +1,186 @@
|
|||
<?php
|
||||
/**
|
||||
* ownCloud - App Framework
|
||||
*
|
||||
* @author Thomas Müller
|
||||
* @copyright 2013 Thomas Müller thomas.mueller@tmit.eu
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 3 of the License, or any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU AFFERO GENERAL PUBLIC LICENSE for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public
|
||||
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
*/
|
||||
|
||||
namespace OC\AppFramework\routing;
|
||||
|
||||
use OC\AppFramework\DependencyInjection\DIContainer;
|
||||
|
||||
/**
|
||||
* Class RouteConfig
|
||||
* @package OC\AppFramework\routing
|
||||
*/
|
||||
class RouteConfig {
|
||||
private $container;
|
||||
private $router;
|
||||
private $routes;
|
||||
private $appName;
|
||||
|
||||
/**
|
||||
* @param \OC\AppFramework\DependencyInjection\DIContainer $container
|
||||
* @param \OC_Router $router
|
||||
* @param string $pathToYml
|
||||
* @internal param $appName
|
||||
*/
|
||||
public function __construct(DIContainer $container, \OC_Router $router, $routes) {
|
||||
$this->routes = $routes;
|
||||
$this->container = $container;
|
||||
$this->router = $router;
|
||||
$this->appName = $container['AppName'];
|
||||
}
|
||||
|
||||
/**
|
||||
* The routes and resource will be registered to the \OC_Router
|
||||
*/
|
||||
public function register() {
|
||||
|
||||
// parse simple
|
||||
$this->processSimpleRoutes($this->routes);
|
||||
|
||||
// parse resources
|
||||
$this->processResources($this->routes);
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates one route base on the give configuration
|
||||
* @param $routes
|
||||
* @throws \UnexpectedValueException
|
||||
*/
|
||||
private function processSimpleRoutes($routes)
|
||||
{
|
||||
$simpleRoutes = isset($routes['routes']) ? $routes['routes'] : array();
|
||||
foreach ($simpleRoutes as $simpleRoute) {
|
||||
$name = $simpleRoute['name'];
|
||||
$url = $simpleRoute['url'];
|
||||
$verb = isset($simpleRoute['verb']) ? strtoupper($simpleRoute['verb']) : 'GET';
|
||||
|
||||
$split = explode('#', $name, 2);
|
||||
if (count($split) != 2) {
|
||||
throw new \UnexpectedValueException('Invalid route name');
|
||||
}
|
||||
$controller = $split[0];
|
||||
$action = $split[1];
|
||||
|
||||
$controllerName = $this->buildControllerName($controller);
|
||||
$actionName = $this->buildActionName($action);
|
||||
|
||||
// register the route
|
||||
$handler = new RouteActionHandler($this->container, $controllerName, $actionName);
|
||||
$this->router->create($this->appName.'.'.$controller.'.'.$action, $url)->method($verb)->action($handler);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* For a given name and url restful routes are created:
|
||||
* - index
|
||||
* - show
|
||||
* - new
|
||||
* - create
|
||||
* - update
|
||||
* - destroy
|
||||
*
|
||||
* @param $routes
|
||||
*/
|
||||
private function processResources($routes)
|
||||
{
|
||||
// declaration of all restful actions
|
||||
$actions = array(
|
||||
array('name' => 'index', 'verb' => 'GET', 'on-collection' => true),
|
||||
array('name' => 'show', 'verb' => 'GET'),
|
||||
array('name' => 'create', 'verb' => 'POST', 'on-collection' => true),
|
||||
array('name' => 'update', 'verb' => 'PUT'),
|
||||
array('name' => 'destroy', 'verb' => 'DELETE'),
|
||||
);
|
||||
|
||||
$resources = isset($routes['resources']) ? $routes['resources'] : array();
|
||||
foreach ($resources as $resource => $config) {
|
||||
|
||||
// the url parameter used as id to the resource
|
||||
$resourceId = $this->buildResourceId($resource);
|
||||
foreach($actions as $action) {
|
||||
$url = $config['url'];
|
||||
$method = $action['name'];
|
||||
$verb = isset($action['verb']) ? strtoupper($action['verb']) : 'GET';
|
||||
$collectionAction = isset($action['on-collection']) ? $action['on-collection'] : false;
|
||||
if (!$collectionAction) {
|
||||
$url = $url . '/' . $resourceId;
|
||||
}
|
||||
if (isset($action['url-postfix'])) {
|
||||
$url = $url . '/' . $action['url-postfix'];
|
||||
}
|
||||
|
||||
$controller = $resource;
|
||||
|
||||
$controllerName = $this->buildControllerName($controller);
|
||||
$actionName = $this->buildActionName($method);
|
||||
|
||||
$routeName = $this->appName . '.' . strtolower($resource) . '.' . strtolower($method);
|
||||
|
||||
$this->router->create($routeName, $url)->method($verb)->action(
|
||||
new RouteActionHandler($this->container, $controllerName, $actionName)
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Based on a given route name the controller name is generated
|
||||
* @param $controller
|
||||
* @return string
|
||||
*/
|
||||
private function buildControllerName($controller)
|
||||
{
|
||||
return $this->underScoreToCamelCase(ucfirst($controller)) . 'Controller';
|
||||
}
|
||||
|
||||
/**
|
||||
* Based on the action part of the route name the controller method name is generated
|
||||
* @param $action
|
||||
* @return string
|
||||
*/
|
||||
private function buildActionName($action) {
|
||||
return $this->underScoreToCamelCase($action);
|
||||
}
|
||||
|
||||
/**
|
||||
* Generates the id used in the url part o the route url
|
||||
* @param $resource
|
||||
* @return string
|
||||
*/
|
||||
private function buildResourceId($resource) {
|
||||
return '{'.$this->underScoreToCamelCase(rtrim($resource, 's')).'Id}';
|
||||
}
|
||||
|
||||
/**
|
||||
* Underscored strings are converted to camel case strings
|
||||
* @param $str string
|
||||
* @return string
|
||||
*/
|
||||
private function underScoreToCamelCase($str) {
|
||||
$pattern = "/_[a-z]?/";
|
||||
return preg_replace_callback(
|
||||
$pattern,
|
||||
function ($matches) {
|
||||
return strtoupper(ltrim($matches[0], "_"));
|
||||
},
|
||||
$str);
|
||||
}
|
||||
}
|
|
@ -0,0 +1,61 @@
|
|||
<?php
|
||||
|
||||
/**
|
||||
* ownCloud - App Framework
|
||||
*
|
||||
* @author Bernhard Posselt
|
||||
* @copyright 2012 Bernhard Posselt nukeawhale@gmail.com
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 3 of the License, or any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU AFFERO GENERAL PUBLIC LICENSE for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public
|
||||
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
*/
|
||||
|
||||
|
||||
namespace OC\AppFramework\Utility;
|
||||
|
||||
|
||||
/**
|
||||
* Reads and parses annotations from doc comments
|
||||
*/
|
||||
class MethodAnnotationReader {
|
||||
|
||||
private $annotations;
|
||||
|
||||
/**
|
||||
* @param object $object an object or classname
|
||||
* @param string $method the method which we want to inspect for annotations
|
||||
*/
|
||||
public function __construct($object, $method){
|
||||
$this->annotations = array();
|
||||
|
||||
$reflection = new \ReflectionMethod($object, $method);
|
||||
$docs = $reflection->getDocComment();
|
||||
|
||||
// extract everything prefixed by @ and first letter uppercase
|
||||
preg_match_all('/@([A-Z]\w+)/', $docs, $matches);
|
||||
$this->annotations = $matches[1];
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Check if a method contains an annotation
|
||||
* @param string $name the name of the annotation
|
||||
* @return bool true if the annotation is found
|
||||
*/
|
||||
public function hasAnnotation($name){
|
||||
return in_array($name, $this->annotations);
|
||||
}
|
||||
|
||||
|
||||
}
|
|
@ -0,0 +1,44 @@
|
|||
<?php
|
||||
|
||||
namespace OC\AppFramework\Utility;
|
||||
|
||||
// register 3rdparty autoloaders
|
||||
require_once __DIR__ . '/../../../3rdparty/Pimple/Pimple.php';
|
||||
|
||||
/**
|
||||
* Class SimpleContainer
|
||||
*
|
||||
* SimpleContainer is a simple implementation of IContainer on basis of \Pimple
|
||||
*/
|
||||
class SimpleContainer extends \Pimple implements \OCP\IContainer {
|
||||
|
||||
/**
|
||||
* @param string $name name of the service to query for
|
||||
* @return object registered service for the given $name
|
||||
*/
|
||||
public function query($name) {
|
||||
return $this->offsetGet($name);
|
||||
}
|
||||
|
||||
function registerParameter($name, $value)
|
||||
{
|
||||
$this[$name] = $value;
|
||||
}
|
||||
|
||||
/**
|
||||
* The given closure is call the first time the given service is queried.
|
||||
* The closure has to return the instance for the given service.
|
||||
* Created instance will be cached in case $shared is true.
|
||||
*
|
||||
* @param string $name name of the service to register another backend for
|
||||
* @param callable $closure the closure to be called on service creation
|
||||
*/
|
||||
function registerService($name, \Closure $closure, $shared = true)
|
||||
{
|
||||
if ($shared) {
|
||||
$this[$name] = \Pimple::share($closure);
|
||||
} else {
|
||||
$this[$name] = $closure;
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,42 @@
|
|||
<?php
|
||||
|
||||
/**
|
||||
* ownCloud - App Framework
|
||||
*
|
||||
* @author Bernhard Posselt
|
||||
* @copyright 2012 Bernhard Posselt nukeawhale@gmail.com
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 3 of the License, or any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU AFFERO GENERAL PUBLIC LICENSE for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public
|
||||
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
*/
|
||||
|
||||
|
||||
namespace OC\AppFramework\Utility;
|
||||
|
||||
|
||||
/**
|
||||
* Needed to mock calls to time()
|
||||
*/
|
||||
class TimeFactory {
|
||||
|
||||
|
||||
/**
|
||||
* @return int the result of a call to time()
|
||||
*/
|
||||
public function getTime() {
|
||||
return time();
|
||||
}
|
||||
|
||||
|
||||
}
|
14
lib/base.php
14
lib/base.php
|
@ -84,6 +84,11 @@ class OC {
|
|||
*/
|
||||
public static $loader = null;
|
||||
|
||||
/**
|
||||
* @var \OC\Server
|
||||
*/
|
||||
public static $server = null;
|
||||
|
||||
public static function initPaths() {
|
||||
// calculate the root directories
|
||||
OC::$SERVERROOT = str_replace("\\", '/', substr(__DIR__, 0, -4));
|
||||
|
@ -451,6 +456,9 @@ class OC {
|
|||
stream_wrapper_register('quota', 'OC\Files\Stream\Quota');
|
||||
stream_wrapper_register('oc', 'OC\Files\Stream\OC');
|
||||
|
||||
// setup the basic server
|
||||
self::$server = new \OC\Server();
|
||||
|
||||
self::initTemplateEngine();
|
||||
if (!self::$CLI) {
|
||||
self::initSession();
|
||||
|
@ -557,11 +565,13 @@ class OC {
|
|||
if (OC_Config::getValue('installed', false)) { //don't try to do this before we are properly setup
|
||||
// register cache cleanup jobs
|
||||
try { //if this is executed before the upgrade to the new backgroundjob system is completed it will throw an exception
|
||||
\OCP\BackgroundJob::registerJob('OC_Cache_FileGlobalGC');
|
||||
\OCP\BackgroundJob::registerJob('OC\Cache\FileGlobalGC');
|
||||
} catch (Exception $e) {
|
||||
|
||||
}
|
||||
OC_Hook::connect('OC_User', 'post_login', 'OC_Cache_File', 'loginListener');
|
||||
// NOTE: This will be replaced to use OCP
|
||||
$userSession = \OC_User::getUserSession();
|
||||
$userSession->listen('postLogin', '\OC\Cache\File', 'loginListener');
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -6,34 +6,36 @@
|
|||
* See the COPYING-README file.
|
||||
*/
|
||||
|
||||
class OC_Cache {
|
||||
namespace OC;
|
||||
|
||||
class Cache {
|
||||
/**
|
||||
* @var OC_Cache $user_cache
|
||||
* @var Cache $user_cache
|
||||
*/
|
||||
static protected $user_cache;
|
||||
/**
|
||||
* @var OC_Cache $global_cache
|
||||
* @var Cache $global_cache
|
||||
*/
|
||||
static protected $global_cache;
|
||||
|
||||
/**
|
||||
* get the global cache
|
||||
* @return OC_Cache
|
||||
* @return Cache
|
||||
*/
|
||||
static public function getGlobalCache() {
|
||||
if (!self::$global_cache) {
|
||||
self::$global_cache = new OC_Cache_FileGlobal();
|
||||
self::$global_cache = new Cache\FileGlobal();
|
||||
}
|
||||
return self::$global_cache;
|
||||
}
|
||||
|
||||
/**
|
||||
* get the user cache
|
||||
* @return OC_Cache
|
||||
* @return Cache
|
||||
*/
|
||||
static public function getUserCache() {
|
||||
if (!self::$user_cache) {
|
||||
self::$user_cache = new OC_Cache_File();
|
||||
self::$user_cache = new Cache\File();
|
||||
}
|
||||
return self::$user_cache;
|
||||
}
|
||||
|
@ -85,7 +87,7 @@ class OC_Cache {
|
|||
|
||||
/**
|
||||
* clear the user cache of all entries starting with a prefix
|
||||
* @param string prefix (optional)
|
||||
* @param string $prefix (optional)
|
||||
* @return bool
|
||||
*/
|
||||
static public function clear($prefix='') {
|
||||
|
@ -93,6 +95,11 @@ class OC_Cache {
|
|||
return $user_cache->clear($prefix);
|
||||
}
|
||||
|
||||
/**
|
||||
* creates cache key based on the files given
|
||||
* @param $files
|
||||
* @return string
|
||||
*/
|
||||
static public function generateCacheKeyFromFiles($files) {
|
||||
$key = '';
|
||||
sort($files);
|
||||
|
|
|
@ -6,8 +6,18 @@
|
|||
* See the COPYING-README file.
|
||||
*/
|
||||
|
||||
class OC_Cache_Broker {
|
||||
namespace OC\Cache;
|
||||
|
||||
class Broker {
|
||||
|
||||
/**
|
||||
* @var \OC\Cache
|
||||
*/
|
||||
protected $fast_cache;
|
||||
|
||||
/**
|
||||
* @var \OC\Cache
|
||||
*/
|
||||
protected $slow_cache;
|
||||
|
||||
public function __construct($fast_cache, $slow_cache) {
|
||||
|
|
|
@ -6,24 +6,25 @@
|
|||
* See the COPYING-README file.
|
||||
*/
|
||||
|
||||
namespace OC\Cache;
|
||||
|
||||
class OC_Cache_File{
|
||||
class File {
|
||||
protected $storage;
|
||||
protected function getStorage() {
|
||||
if (isset($this->storage)) {
|
||||
return $this->storage;
|
||||
}
|
||||
if(OC_User::isLoggedIn()) {
|
||||
\OC\Files\Filesystem::initMountPoints(OC_User::getUser());
|
||||
if(\OC_User::isLoggedIn()) {
|
||||
\OC\Files\Filesystem::initMountPoints(\OC_User::getUser());
|
||||
$subdir = 'cache';
|
||||
$view = new \OC\Files\View('/'.OC_User::getUser());
|
||||
$view = new \OC\Files\View('/' . \OC_User::getUser());
|
||||
if(!$view->file_exists($subdir)) {
|
||||
$view->mkdir($subdir);
|
||||
}
|
||||
$this->storage = new \OC\Files\View('/'.OC_User::getUser().'/'.$subdir);
|
||||
$this->storage = new \OC\Files\View('/' . \OC_User::getUser().'/'.$subdir);
|
||||
return $this->storage;
|
||||
}else{
|
||||
OC_Log::write('core', 'Can\'t get cache storage, user not logged in', OC_Log::ERROR);
|
||||
\OC_Log::write('core', 'Can\'t get cache storage, user not logged in', \OC_Log::ERROR);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -6,10 +6,11 @@
|
|||
* See the COPYING-README file.
|
||||
*/
|
||||
|
||||
namespace OC\Cache;
|
||||
|
||||
class OC_Cache_FileGlobal{
|
||||
class FileGlobal {
|
||||
static protected function getCacheDir() {
|
||||
$cache_dir = get_temp_dir().'/owncloud-'.OC_Util::getInstanceId().'/';
|
||||
$cache_dir = get_temp_dir().'/owncloud-' . \OC_Util::getInstanceId().'/';
|
||||
if (!is_dir($cache_dir)) {
|
||||
mkdir($cache_dir);
|
||||
}
|
||||
|
@ -80,13 +81,13 @@ class OC_Cache_FileGlobal{
|
|||
}
|
||||
|
||||
static public function gc() {
|
||||
$last_run = OC_AppConfig::getValue('core', 'global_cache_gc_lastrun', 0);
|
||||
$last_run = \OC_AppConfig::getValue('core', 'global_cache_gc_lastrun', 0);
|
||||
$now = time();
|
||||
if (($now - $last_run) < 300) {
|
||||
// only do cleanup every 5 minutes
|
||||
return;
|
||||
}
|
||||
OC_AppConfig::setValue('core', 'global_cache_gc_lastrun', $now);
|
||||
\OC_AppConfig::setValue('core', 'global_cache_gc_lastrun', $now);
|
||||
$cache_dir = self::getCacheDir();
|
||||
if($cache_dir and is_dir($cache_dir)) {
|
||||
$dh=opendir($cache_dir);
|
||||
|
|
|
@ -1,8 +1,9 @@
|
|||
<?php
|
||||
|
||||
namespace OC\Cache;
|
||||
|
||||
class OC_Cache_FileGlobalGC extends \OC\BackgroundJob\Job{
|
||||
class FileGlobalGC extends \OC\BackgroundJob\Job{
|
||||
public function run($argument){
|
||||
OC_Cache_FileGlobal::gc();
|
||||
FileGlobal::gc();
|
||||
}
|
||||
}
|
||||
|
|
|
@ -0,0 +1,77 @@
|
|||
<?php
|
||||
/**
|
||||
* Copyright (c) 2013 Thomas Tanghus (thomas@tanghus.net)
|
||||
* This file is licensed under the Affero General Public License version 3 or
|
||||
* later.
|
||||
* See the COPYING-README file.
|
||||
*/
|
||||
namespace OC\Cache;
|
||||
|
||||
/**
|
||||
* This interface defines method for accessing the file based user cache.
|
||||
*/
|
||||
class UserCache implements \OCP\ICache {
|
||||
|
||||
/**
|
||||
* @var \OC\Cache\File $userCache
|
||||
*/
|
||||
protected $userCache;
|
||||
|
||||
public function __construct() {
|
||||
$this->userCache = new File();
|
||||
}
|
||||
|
||||
/**
|
||||
* Get a value from the user cache
|
||||
*
|
||||
* @param string $key
|
||||
* @return mixed
|
||||
*/
|
||||
public function get($key) {
|
||||
return $this->userCache->get($key);
|
||||
}
|
||||
|
||||
/**
|
||||
* Set a value in the user cache
|
||||
*
|
||||
* @param string $key
|
||||
* @param mixed $value
|
||||
* @param int $ttl Time To Live in seconds. Defaults to 60*60*24
|
||||
* @return bool
|
||||
*/
|
||||
public function set($key, $value, $ttl = 0) {
|
||||
if (empty($key)) {
|
||||
return false;
|
||||
}
|
||||
return $this->userCache->set($key, $value, $ttl);
|
||||
}
|
||||
|
||||
/**
|
||||
* Check if a value is set in the user cache
|
||||
*
|
||||
* @param string $key
|
||||
* @return bool
|
||||
*/
|
||||
public function hasKey($key) {
|
||||
return $this->userCache->hasKey($key);
|
||||
}
|
||||
|
||||
/**
|
||||
* Remove an item from the user cache
|
||||
*
|
||||
* @param string $key
|
||||
* @return bool
|
||||
*/
|
||||
public function remove($key) {
|
||||
return $this->userCache->remove($key);
|
||||
}
|
||||
|
||||
/**
|
||||
* clear the user cache of all entries starting with a prefix
|
||||
* @param string $prefix (optional)
|
||||
* @return bool
|
||||
*/
|
||||
public function clear($prefix = '') {
|
||||
return $this->userCache->clear($prefix);
|
||||
}
|
||||
}
|
|
@ -0,0 +1,145 @@
|
|||
<?php
|
||||
/**
|
||||
* ownCloud
|
||||
*
|
||||
* @author Thomas Müller
|
||||
* @copyright 2013 Thomas Müller thomas.mueller@tmit.eu
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 3 of the License, or any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU AFFERO GENERAL PUBLIC LICENSE for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public
|
||||
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
*/
|
||||
|
||||
namespace OC {
|
||||
|
||||
class ContactsManager implements \OCP\Contacts\IManager {
|
||||
|
||||
/**
|
||||
* This function is used to search and find contacts within the users address books.
|
||||
* In case $pattern is empty all contacts will be returned.
|
||||
*
|
||||
* @param string $pattern which should match within the $searchProperties
|
||||
* @param array $searchProperties defines the properties within the query pattern should match
|
||||
* @param array $options - for future use. One should always have options!
|
||||
* @return array of contacts which are arrays of key-value-pairs
|
||||
*/
|
||||
public function search($pattern, $searchProperties = array(), $options = array()) {
|
||||
$result = array();
|
||||
foreach($this->address_books as $address_book) {
|
||||
$r = $address_book->search($pattern, $searchProperties, $options);
|
||||
$result = array_merge($result, $r);
|
||||
}
|
||||
|
||||
return $result;
|
||||
}
|
||||
|
||||
/**
|
||||
* This function can be used to delete the contact identified by the given id
|
||||
*
|
||||
* @param object $id the unique identifier to a contact
|
||||
* @param $address_book_key
|
||||
* @return bool successful or not
|
||||
*/
|
||||
public function delete($id, $address_book_key) {
|
||||
if (!array_key_exists($address_book_key, $this->address_books))
|
||||
return null;
|
||||
|
||||
$address_book = $this->address_books[$address_book_key];
|
||||
if ($address_book->getPermissions() & \OCP\PERMISSION_DELETE)
|
||||
return null;
|
||||
|
||||
return $address_book->delete($id);
|
||||
}
|
||||
|
||||
/**
|
||||
* This function is used to create a new contact if 'id' is not given or not present.
|
||||
* Otherwise the contact will be updated by replacing the entire data set.
|
||||
*
|
||||
* @param array $properties this array if key-value-pairs defines a contact
|
||||
* @param $address_book_key string to identify the address book in which the contact shall be created or updated
|
||||
* @return array representing the contact just created or updated
|
||||
*/
|
||||
public function createOrUpdate($properties, $address_book_key) {
|
||||
|
||||
if (!array_key_exists($address_book_key, $this->address_books))
|
||||
return null;
|
||||
|
||||
$address_book = $this->address_books[$address_book_key];
|
||||
if ($address_book->getPermissions() & \OCP\PERMISSION_CREATE)
|
||||
return null;
|
||||
|
||||
return $address_book->createOrUpdate($properties);
|
||||
}
|
||||
|
||||
/**
|
||||
* Check if contacts are available (e.g. contacts app enabled)
|
||||
*
|
||||
* @return bool true if enabled, false if not
|
||||
*/
|
||||
public function isEnabled() {
|
||||
return !empty($this->address_books);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param \OCP\IAddressBook $address_book
|
||||
*/
|
||||
public function registerAddressBook(\OCP\IAddressBook $address_book) {
|
||||
$this->address_books[$address_book->getKey()] = $address_book;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param \OCP\IAddressBook $address_book
|
||||
*/
|
||||
public function unregisterAddressBook(\OCP\IAddressBook $address_book) {
|
||||
unset($this->address_books[$address_book->getKey()]);
|
||||
}
|
||||
|
||||
/**
|
||||
* @return array
|
||||
*/
|
||||
public function getAddressBooks() {
|
||||
$result = array();
|
||||
foreach($this->address_books as $address_book) {
|
||||
$result[$address_book->getKey()] = $address_book->getDisplayName();
|
||||
}
|
||||
|
||||
return $result;
|
||||
}
|
||||
|
||||
/**
|
||||
* removes all registered address book instances
|
||||
*/
|
||||
public function clear() {
|
||||
$this->address_books = array();
|
||||
}
|
||||
|
||||
/**
|
||||
* @var \OCP\IAddressBook[] which holds all registered address books
|
||||
*/
|
||||
private $address_books = array();
|
||||
|
||||
/**
|
||||
* In order to improve lazy loading a closure can be registered which will be called in case
|
||||
* address books are actually requested
|
||||
*
|
||||
* @param string $key
|
||||
* @param \Closure $callable
|
||||
*/
|
||||
function register($key, \Closure $callable)
|
||||
{
|
||||
//
|
||||
//TODO: implement me
|
||||
//
|
||||
}
|
||||
}
|
||||
}
|
|
@ -12,7 +12,7 @@ use Doctrine\DBAL\Configuration;
|
|||
use Doctrine\DBAL\Cache\QueryCacheProfile;
|
||||
use Doctrine\Common\EventManager;
|
||||
|
||||
class Connection extends \Doctrine\DBAL\Connection {
|
||||
class Connection extends \Doctrine\DBAL\Connection implements \OCP\IDBConnection {
|
||||
/**
|
||||
* @var string $tablePrefix
|
||||
*/
|
||||
|
|
|
@ -29,7 +29,7 @@ class OC_FileChunking {
|
|||
|
||||
protected function getCache() {
|
||||
if (!isset($this->cache)) {
|
||||
$this->cache = new OC_Cache_File();
|
||||
$this->cache = new \OC\Cache\File();
|
||||
}
|
||||
return $this->cache;
|
||||
}
|
||||
|
|
|
@ -0,0 +1,10 @@
|
|||
<?php
|
||||
/**
|
||||
* Copyright (c) 2013 Thomas Tanghus (thomas@tanghus.net)
|
||||
* This file is licensed under the Affero General Public License version 3 or
|
||||
* later.
|
||||
* See the COPYING-README file.
|
||||
*/
|
||||
|
||||
class OC_Cache extends \OC\Cache {
|
||||
}
|
|
@ -0,0 +1,64 @@
|
|||
<?php
|
||||
/**
|
||||
* Copyright (c) 2013 Bart Visscher <bartv@thisnet.nl>
|
||||
* This file is licensed under the Affero General Public License version 3 or
|
||||
* later.
|
||||
* See the COPYING-README file.
|
||||
*
|
||||
*/
|
||||
|
||||
namespace OC;
|
||||
|
||||
/**
|
||||
* Manages the ownCloud navigation
|
||||
*/
|
||||
class NavigationManager implements \OCP\INavigationManager {
|
||||
protected $entries = array();
|
||||
protected $activeEntry;
|
||||
|
||||
/**
|
||||
* Creates a new navigation entry
|
||||
* @param array $entry containing: id, name, order, icon and href key
|
||||
*/
|
||||
public function add(array $entry) {
|
||||
$entry['active'] = false;
|
||||
if(!isset($entry['icon'])) {
|
||||
$entry['icon'] = '';
|
||||
}
|
||||
$this->entries[] = $entry;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief returns all the added Menu entries
|
||||
* @return array of the added entries
|
||||
*/
|
||||
public function getAll() {
|
||||
return $this->entries;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief removes all the entries
|
||||
*/
|
||||
public function clear() {
|
||||
$this->entries = array();
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the current navigation entry of the currently running app
|
||||
* @param string $id of the app entry to activate (from added $entry)
|
||||
*/
|
||||
public function setActiveEntry($id) {
|
||||
$this->activeEntry = $id;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief gets the active Menu entry
|
||||
* @return string id or empty string
|
||||
*
|
||||
* This function returns the id of the active navigation entry (set by
|
||||
* setActiveEntry
|
||||
*/
|
||||
public function getActiveEntry() {
|
||||
return $this->activeEntry;
|
||||
}
|
||||
}
|
|
@ -42,6 +42,9 @@ class Preview {
|
|||
private $scalingup;
|
||||
|
||||
//preview images object
|
||||
/**
|
||||
* @var \OC_Image
|
||||
*/
|
||||
private $preview;
|
||||
|
||||
//preview providers
|
||||
|
@ -624,4 +627,4 @@ class Preview {
|
|||
}
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -0,0 +1,38 @@
|
|||
<?php
|
||||
/**
|
||||
* Copyright (c) 2013 Thomas Müller thomas.mueller@tmit.eu
|
||||
* This file is licensed under the Affero General Public License version 3 or
|
||||
* later.
|
||||
* See the COPYING-README file.
|
||||
*
|
||||
*/
|
||||
namespace OC;
|
||||
|
||||
use OCP\image;
|
||||
use OCP\IPreview;
|
||||
|
||||
class PreviewManager implements IPreview {
|
||||
/**
|
||||
* @brief return a preview of a file
|
||||
* @param string $file The path to the file where you want a thumbnail from
|
||||
* @param int $maxX The maximum X size of the thumbnail. It can be smaller depending on the shape of the image
|
||||
* @param int $maxY The maximum Y size of the thumbnail. It can be smaller depending on the shape of the image
|
||||
* @param boolean $scaleUp Scale smaller images up to the thumbnail size or not. Might look ugly
|
||||
* @return \OCP\Image
|
||||
*/
|
||||
function createPreview($file, $maxX = 100, $maxY = 75, $scaleUp = false)
|
||||
{
|
||||
$preview = new \OC\Preview('', '/', $file, $maxX, $maxY, $scaleUp);
|
||||
return $preview->getPreview();
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief returns true if the passed mime type is supported
|
||||
* @param string $mimeType
|
||||
* @return boolean
|
||||
*/
|
||||
function isMimeSupported($mimeType = '*')
|
||||
{
|
||||
return \OC\Preview::isMimeSupported($mimeType);
|
||||
}
|
||||
}
|
|
@ -35,10 +35,10 @@ namespace OCP;
|
|||
*/
|
||||
class App {
|
||||
/**
|
||||
* @brief Makes owncloud aware of this app
|
||||
* @brief Makes ownCloud aware of this app
|
||||
* @brief This call is deprecated and not necessary to use.
|
||||
* @param $data array with all information
|
||||
* @returns true/false
|
||||
* @returns boolean
|
||||
*
|
||||
* @deprecated this method is deprecated
|
||||
* Do not call it anymore
|
||||
|
@ -52,7 +52,7 @@ class App {
|
|||
/**
|
||||
* @brief adds an entry to the navigation
|
||||
* @param $data array containing the data
|
||||
* @returns true/false
|
||||
* @returns boolean
|
||||
*
|
||||
* This function adds a new entry to the navigation visible to users. $data
|
||||
* is an associative array.
|
||||
|
@ -72,8 +72,8 @@ class App {
|
|||
|
||||
/**
|
||||
* @brief marks a navigation entry as active
|
||||
* @param $id id of the entry
|
||||
* @returns true/false
|
||||
* @param $id string id of the entry
|
||||
* @returns boolean
|
||||
*
|
||||
* This function sets a navigation entry as active and removes the 'active'
|
||||
* property from all other entries. The templates can use this for
|
||||
|
@ -104,7 +104,7 @@ class App {
|
|||
/**
|
||||
* @brief Read app metadata from the info.xml file
|
||||
* @param string $app id of the app or the path of the info.xml file
|
||||
* @param boolean path (optional)
|
||||
* @param boolean $path (optional)
|
||||
* @returns array
|
||||
*/
|
||||
public static function getAppInfo( $app, $path=false ) {
|
||||
|
@ -114,7 +114,7 @@ class App {
|
|||
/**
|
||||
* @brief checks whether or not an app is enabled
|
||||
* @param $app app
|
||||
* @returns true/false
|
||||
* @returns boolean
|
||||
*
|
||||
* This function checks whether or not an app is enabled.
|
||||
*/
|
||||
|
@ -133,7 +133,7 @@ class App {
|
|||
/**
|
||||
* @brief Get the last version of the app, either from appinfo/version or from appinfo/info.xml
|
||||
* @param $app app
|
||||
* @returns true/false
|
||||
* @returns boolean
|
||||
*/
|
||||
public static function getAppVersion( $app ) {
|
||||
return \OC_App::getAppVersion( $app );
|
||||
|
|
|
@ -0,0 +1,81 @@
|
|||
<?php
|
||||
/**
|
||||
* ownCloud
|
||||
*
|
||||
* @author Thomas Müller
|
||||
* @copyright 2013 Thomas Müller deepdiver@owncloud.com
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 3 of the License, or any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU AFFERO GENERAL PUBLIC LICENSE for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public
|
||||
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
*/
|
||||
|
||||
namespace OCP\AppFramework;
|
||||
|
||||
|
||||
/**
|
||||
* Class App
|
||||
* @package OCP\AppFramework
|
||||
*
|
||||
* Any application must inherit this call - all controller instances to be used are
|
||||
* to be registered using IContainer::registerService
|
||||
*/
|
||||
class App {
|
||||
public function __construct($appName) {
|
||||
$this->container = new \OC\AppFramework\DependencyInjection\DIContainer($appName);
|
||||
}
|
||||
|
||||
private $container;
|
||||
|
||||
/**
|
||||
* @return IAppContainer
|
||||
*/
|
||||
public function getContainer() {
|
||||
return $this->container;
|
||||
}
|
||||
|
||||
/**
|
||||
* This function is called by the routing component to fire up the frameworks dispatch mechanism.
|
||||
*
|
||||
* Example code in routes.php of the task app:
|
||||
* $this->create('tasks_index', '/')->get()->action(
|
||||
* function($params){
|
||||
* $app = new TaskApp();
|
||||
* $app->dispatch('PageController', 'index', $params);
|
||||
* }
|
||||
* );
|
||||
*
|
||||
*
|
||||
* Example for for TaskApp implementation:
|
||||
* class TaskApp extends \OCP\AppFramework\App {
|
||||
*
|
||||
* public function __construct(){
|
||||
* parent::__construct('tasks');
|
||||
*
|
||||
* $this->getContainer()->registerService('PageController', function(IAppContainer $c){
|
||||
* $a = $c->query('API');
|
||||
* $r = $c->query('Request');
|
||||
* return new PageController($a, $r);
|
||||
* });
|
||||
* }
|
||||
* }
|
||||
*
|
||||
* @param string $controllerName the name of the controller under which it is
|
||||
* stored in the DI container
|
||||
* @param string $methodName the method that you want to call
|
||||
* @param array $urlParams an array with variables extracted from the routes
|
||||
*/
|
||||
public function dispatch($controllerName, $methodName, array $urlParams) {
|
||||
\OC\AppFramework\App::main($controllerName, $methodName, $urlParams, $this->container);
|
||||
}
|
||||
}
|
|
@ -0,0 +1,89 @@
|
|||
<?php
|
||||
|
||||
/**
|
||||
* ownCloud - App Framework
|
||||
*
|
||||
* @author Bernhard Posselt, Thomas Tanghus, Bart Visscher
|
||||
* @copyright 2012 Bernhard Posselt nukeawhale@gmail.com
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 3 of the License, or any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU AFFERO GENERAL PUBLIC LICENSE for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public
|
||||
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
*/
|
||||
|
||||
|
||||
namespace OCP\AppFramework\Http;
|
||||
|
||||
|
||||
class Http {
|
||||
|
||||
const STATUS_CONTINUE = 100;
|
||||
const STATUS_SWITCHING_PROTOCOLS = 101;
|
||||
const STATUS_PROCESSING = 102;
|
||||
const STATUS_OK = 200;
|
||||
const STATUS_CREATED = 201;
|
||||
const STATUS_ACCEPTED = 202;
|
||||
const STATUS_NON_AUTHORATIVE_INFORMATION = 203;
|
||||
const STATUS_NO_CONTENT = 204;
|
||||
const STATUS_RESET_CONTENT = 205;
|
||||
const STATUS_PARTIAL_CONTENT = 206;
|
||||
const STATUS_MULTI_STATUS = 207;
|
||||
const STATUS_ALREADY_REPORTED = 208;
|
||||
const STATUS_IM_USED = 226;
|
||||
const STATUS_MULTIPLE_CHOICES = 300;
|
||||
const STATUS_MOVED_PERMANENTLY = 301;
|
||||
const STATUS_FOUND = 302;
|
||||
const STATUS_SEE_OTHER = 303;
|
||||
const STATUS_NOT_MODIFIED = 304;
|
||||
const STATUS_USE_PROXY = 305;
|
||||
const STATUS_RESERVED = 306;
|
||||
const STATUS_TEMPORARY_REDIRECT = 307;
|
||||
const STATUS_BAD_REQUEST = 400;
|
||||
const STATUS_UNAUTHORIZED = 401;
|
||||
const STATUS_PAYMENT_REQUIRED = 402;
|
||||
const STATUS_FORBIDDEN = 403;
|
||||
const STATUS_NOT_FOUND = 404;
|
||||
const STATUS_METHOD_NOT_ALLOWED = 405;
|
||||
const STATUS_NOT_ACCEPTABLE = 406;
|
||||
const STATUS_PROXY_AUTHENTICATION_REQUIRED = 407;
|
||||
const STATUS_REQUEST_TIMEOUT = 408;
|
||||
const STATUS_CONFLICT = 409;
|
||||
const STATUS_GONE = 410;
|
||||
const STATUS_LENGTH_REQUIRED = 411;
|
||||
const STATUS_PRECONDITION_FAILED = 412;
|
||||
const STATUS_REQUEST_ENTITY_TOO_LARGE = 413;
|
||||
const STATUS_REQUEST_URI_TOO_LONG = 414;
|
||||
const STATUS_UNSUPPORTED_MEDIA_TYPE = 415;
|
||||
const STATUS_REQUEST_RANGE_NOT_SATISFIABLE = 416;
|
||||
const STATUS_EXPECTATION_FAILED = 417;
|
||||
const STATUS_IM_A_TEAPOT = 418;
|
||||
const STATUS_UNPROCESSABLE_ENTITY = 422;
|
||||
const STATUS_LOCKED = 423;
|
||||
const STATUS_FAILED_DEPENDENCY = 424;
|
||||
const STATUS_UPGRADE_REQUIRED = 426;
|
||||
const STATUS_PRECONDITION_REQUIRED = 428;
|
||||
const STATUS_TOO_MANY_REQUESTS = 429;
|
||||
const STATUS_REQUEST_HEADER_FIELDS_TOO_LARGE = 431;
|
||||
const STATUS_INTERNAL_SERVER_ERROR = 500;
|
||||
const STATUS_NOT_IMPLEMENTED = 501;
|
||||
const STATUS_BAD_GATEWAY = 502;
|
||||
const STATUS_SERVICE_UNAVAILABLE = 503;
|
||||
const STATUS_GATEWAY_TIMEOUT = 504;
|
||||
const STATUS_HTTP_VERSION_NOT_SUPPORTED = 505;
|
||||
const STATUS_VARIANT_ALSO_NEGOTIATES = 506;
|
||||
const STATUS_INSUFFICIENT_STORAGE = 507;
|
||||
const STATUS_LOOP_DETECTED = 508;
|
||||
const STATUS_BANDWIDTH_LIMIT_EXCEEDED = 509;
|
||||
const STATUS_NOT_EXTENDED = 510;
|
||||
const STATUS_NETWORK_AUTHENTICATION_REQUIRED = 511;
|
||||
}
|
|
@ -0,0 +1,74 @@
|
|||
<?php
|
||||
|
||||
/**
|
||||
* ownCloud - App Framework
|
||||
*
|
||||
* @author Bernhard Posselt
|
||||
* @copyright 2012 Bernhard Posselt nukeawhale@gmail.com
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 3 of the License, or any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU AFFERO GENERAL PUBLIC LICENSE for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public
|
||||
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
*/
|
||||
|
||||
|
||||
namespace OCP\AppFramework\Http;
|
||||
|
||||
|
||||
/**
|
||||
* A renderer for JSON calls
|
||||
*/
|
||||
class JSONResponse extends Response {
|
||||
|
||||
protected $data;
|
||||
|
||||
|
||||
/**
|
||||
* @param array|object $data the object or array that should be transformed
|
||||
* @param int $statusCode the Http status code, defaults to 200
|
||||
*/
|
||||
public function __construct($data=array(), $statusCode=Http::STATUS_OK) {
|
||||
$this->data = $data;
|
||||
$this->setStatus($statusCode);
|
||||
$this->addHeader('X-Content-Type-Options', 'nosniff');
|
||||
$this->addHeader('Content-type', 'application/json; charset=utf-8');
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Returns the rendered json
|
||||
* @return string the rendered json
|
||||
*/
|
||||
public function render(){
|
||||
return json_encode($this->data);
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets values in the data json array
|
||||
* @param array|object $params an array or object which will be transformed
|
||||
* to JSON
|
||||
*/
|
||||
public function setData($data){
|
||||
$this->data = $data;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Used to get the set parameters
|
||||
* @return array the data
|
||||
*/
|
||||
public function getData(){
|
||||
return $this->data;
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,169 @@
|
|||
<?php
|
||||
|
||||
/**
|
||||
* ownCloud - App Framework
|
||||
*
|
||||
* @author Bernhard Posselt, Thomas Tanghus, Bart Visscher
|
||||
* @copyright 2012 Bernhard Posselt nukeawhale@gmail.com
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 3 of the License, or any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU AFFERO GENERAL PUBLIC LICENSE for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public
|
||||
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
*/
|
||||
|
||||
|
||||
namespace OCP\AppFramework\Http;
|
||||
|
||||
|
||||
/**
|
||||
* Base class for responses. Also used to just send headers
|
||||
*/
|
||||
class Response {
|
||||
|
||||
/**
|
||||
* @var array default headers
|
||||
*/
|
||||
private $headers = array(
|
||||
'Cache-Control' => 'no-cache, must-revalidate'
|
||||
);
|
||||
|
||||
|
||||
/**
|
||||
* @var string
|
||||
*/
|
||||
private $status = Http::STATUS_OK;
|
||||
|
||||
|
||||
/**
|
||||
* @var \DateTime
|
||||
*/
|
||||
private $lastModified;
|
||||
|
||||
|
||||
/**
|
||||
* @var string
|
||||
*/
|
||||
private $ETag;
|
||||
|
||||
|
||||
/**
|
||||
* Caches the response
|
||||
* @param int $cacheSeconds the amount of seconds that should be cached
|
||||
* if 0 then caching will be disabled
|
||||
*/
|
||||
public function cacheFor($cacheSeconds) {
|
||||
|
||||
if($cacheSeconds > 0) {
|
||||
$this->addHeader('Cache-Control', 'max-age=' . $cacheSeconds .
|
||||
', must-revalidate');
|
||||
} else {
|
||||
$this->addHeader('Cache-Control', 'no-cache, must-revalidate');
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Adds a new header to the response that will be called before the render
|
||||
* function
|
||||
* @param string $name The name of the HTTP header
|
||||
* @param string $value The value, null will delete it
|
||||
*/
|
||||
public function addHeader($name, $value) {
|
||||
if(is_null($value)) {
|
||||
unset($this->headers[$name]);
|
||||
} else {
|
||||
$this->headers[$name] = $value;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Returns the set headers
|
||||
* @return array the headers
|
||||
*/
|
||||
public function getHeaders() {
|
||||
$mergeWith = array();
|
||||
|
||||
if($this->lastModified) {
|
||||
$mergeWith['Last-Modified'] =
|
||||
$this->lastModified->format(\DateTime::RFC2822);
|
||||
}
|
||||
|
||||
if($this->ETag) {
|
||||
$mergeWith['ETag'] = '"' . $this->ETag . '"';
|
||||
}
|
||||
|
||||
return array_merge($mergeWith, $this->headers);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* By default renders no output
|
||||
* @return null
|
||||
*/
|
||||
public function render() {
|
||||
return null;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Set response status
|
||||
* @param int $status a HTTP status code, see also the STATUS constants
|
||||
*/
|
||||
public function setStatus($status) {
|
||||
$this->status = $status;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Get response status
|
||||
*/
|
||||
public function getStatus() {
|
||||
return $this->status;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @return string the etag
|
||||
*/
|
||||
public function getETag() {
|
||||
return $this->ETag;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @return string RFC2822 formatted last modified date
|
||||
*/
|
||||
public function getLastModified() {
|
||||
return $this->lastModified;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @param string $ETag
|
||||
*/
|
||||
public function setETag($ETag) {
|
||||
$this->ETag = $ETag;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @param \DateTime $lastModified
|
||||
*/
|
||||
public function setLastModified($lastModified) {
|
||||
$this->lastModified = $lastModified;
|
||||
}
|
||||
|
||||
|
||||
}
|
|
@ -0,0 +1,126 @@
|
|||
<?php
|
||||
|
||||
/**
|
||||
* ownCloud - App Framework
|
||||
*
|
||||
* @author Bernhard Posselt
|
||||
* @copyright 2012 Bernhard Posselt nukeawhale@gmail.com
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 3 of the License, or any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU AFFERO GENERAL PUBLIC LICENSE for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public
|
||||
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
*/
|
||||
|
||||
|
||||
namespace OCP\AppFramework\Http;
|
||||
|
||||
use OC\AppFramework\Core\API;
|
||||
|
||||
|
||||
/**
|
||||
* Response for a normal template
|
||||
*/
|
||||
class TemplateResponse extends Response {
|
||||
|
||||
protected $templateName;
|
||||
protected $params;
|
||||
protected $api;
|
||||
protected $renderAs;
|
||||
protected $appName;
|
||||
|
||||
/**
|
||||
* @param API $api an API instance
|
||||
* @param string $templateName the name of the template
|
||||
* @param string $appName optional if you want to include a template from
|
||||
* a different app
|
||||
*/
|
||||
public function __construct(API $api, $templateName, $appName=null) {
|
||||
$this->templateName = $templateName;
|
||||
$this->appName = $appName;
|
||||
$this->api = $api;
|
||||
$this->params = array();
|
||||
$this->renderAs = 'user';
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Sets template parameters
|
||||
* @param array $params an array with key => value structure which sets template
|
||||
* variables
|
||||
*/
|
||||
public function setParams(array $params){
|
||||
$this->params = $params;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Used for accessing the set parameters
|
||||
* @return array the params
|
||||
*/
|
||||
public function getParams(){
|
||||
return $this->params;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Used for accessing the name of the set template
|
||||
* @return string the name of the used template
|
||||
*/
|
||||
public function getTemplateName(){
|
||||
return $this->templateName;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Sets the template page
|
||||
* @param string $renderAs admin, user or blank. Admin also prints the admin
|
||||
* settings header and footer, user renders the normal
|
||||
* normal page including footer and header and blank
|
||||
* just renders the plain template
|
||||
*/
|
||||
public function renderAs($renderAs){
|
||||
$this->renderAs = $renderAs;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Returns the set renderAs
|
||||
* @return string the renderAs value
|
||||
*/
|
||||
public function getRenderAs(){
|
||||
return $this->renderAs;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Returns the rendered html
|
||||
* @return string the rendered html
|
||||
*/
|
||||
public function render(){
|
||||
|
||||
if($this->appName !== null){
|
||||
$appName = $this->appName;
|
||||
} else {
|
||||
$appName = $this->api->getAppName();
|
||||
}
|
||||
|
||||
$template = $this->api->getTemplate($this->templateName, $this->renderAs, $appName);
|
||||
|
||||
foreach($this->params as $key => $value){
|
||||
$template->assign($key, $value);
|
||||
}
|
||||
|
||||
return $template->fetchPage();
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,151 @@
|
|||
<?php
|
||||
|
||||
/**
|
||||
* ownCloud - App Framework
|
||||
*
|
||||
* @author Bernhard Posselt
|
||||
* @copyright 2012 Bernhard Posselt nukeawhale@gmail.com
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 3 of the License, or any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU AFFERO GENERAL PUBLIC LICENSE for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public
|
||||
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
*/
|
||||
|
||||
|
||||
namespace OCP\AppFramework;
|
||||
|
||||
|
||||
/**
|
||||
* A few very basic and frequently used API functions are combined in here
|
||||
*/
|
||||
interface IApi {
|
||||
|
||||
|
||||
/**
|
||||
* Gets the userid of the current user
|
||||
* @return string the user id of the current user
|
||||
*/
|
||||
function getUserId();
|
||||
|
||||
|
||||
/**
|
||||
* Adds a new javascript file
|
||||
* @param string $scriptName the name of the javascript in js/ without the suffix
|
||||
* @param string $appName the name of the app, defaults to the current one
|
||||
*/
|
||||
function addScript($scriptName, $appName = null);
|
||||
|
||||
|
||||
/**
|
||||
* Adds a new css file
|
||||
* @param string $styleName the name of the css file in css/without the suffix
|
||||
* @param string $appName the name of the app, defaults to the current one
|
||||
*/
|
||||
function addStyle($styleName, $appName = null);
|
||||
|
||||
|
||||
/**
|
||||
* shorthand for addScript for files in the 3rdparty directory
|
||||
* @param string $name the name of the file without the suffix
|
||||
*/
|
||||
function add3rdPartyScript($name);
|
||||
|
||||
|
||||
/**
|
||||
* shorthand for addStyle for files in the 3rdparty directory
|
||||
* @param string $name the name of the file without the suffix
|
||||
*/
|
||||
function add3rdPartyStyle($name);
|
||||
|
||||
/**
|
||||
* Returns the translation object
|
||||
* @return \OC_L10N the translation object
|
||||
*
|
||||
* FIXME: returns private object / should be retrieved from teh ServerContainer
|
||||
*/
|
||||
function getTrans();
|
||||
|
||||
|
||||
/**
|
||||
* Returns the URL for a route
|
||||
* @param string $routeName the name of the route
|
||||
* @param array $arguments an array with arguments which will be filled into the url
|
||||
* @return string the url
|
||||
*/
|
||||
function linkToRoute($routeName, $arguments=array());
|
||||
|
||||
|
||||
/**
|
||||
* Returns an URL for an image or file
|
||||
* @param string $file the name of the file
|
||||
* @param string $appName the name of the app, defaults to the current one
|
||||
*/
|
||||
function linkTo($file, $appName=null);
|
||||
|
||||
|
||||
/**
|
||||
* Returns the link to an image, like link to but only with prepending img/
|
||||
* @param string $file the name of the file
|
||||
* @param string $appName the name of the app, defaults to the current one
|
||||
*/
|
||||
function imagePath($file, $appName = null);
|
||||
|
||||
|
||||
/**
|
||||
* Makes an URL absolute
|
||||
* @param string $url the url
|
||||
* @return string the absolute url
|
||||
*
|
||||
* FIXME: function should live in Request / Response
|
||||
*/
|
||||
function getAbsoluteURL($url);
|
||||
|
||||
|
||||
/**
|
||||
* links to a file
|
||||
* @param string $file the name of the file
|
||||
* @param string $appName the name of the app, defaults to the current one
|
||||
* @deprecated replaced with linkToRoute()
|
||||
* @return string the url
|
||||
*/
|
||||
function linkToAbsolute($file, $appName = null);
|
||||
|
||||
|
||||
/**
|
||||
* Checks if an app is enabled
|
||||
* @param string $appName the name of an app
|
||||
* @return bool true if app is enabled
|
||||
*/
|
||||
public function isAppEnabled($appName);
|
||||
|
||||
|
||||
/**
|
||||
* Writes a function into the error log
|
||||
* @param string $msg the error message to be logged
|
||||
* @param int $level the error level
|
||||
*
|
||||
* FIXME: add logger instance to ServerContainer
|
||||
*/
|
||||
function log($msg, $level = null);
|
||||
|
||||
|
||||
/**
|
||||
* Returns a template
|
||||
* @param string $templateName the name of the template
|
||||
* @param string $renderAs how it should be rendered
|
||||
* @param string $appName the name of the app
|
||||
* @return \OCP\Template a new template
|
||||
*/
|
||||
function getTemplate($templateName, $renderAs='user', $appName=null);
|
||||
|
||||
}
|
|
@ -0,0 +1,57 @@
|
|||
<?php
|
||||
/**
|
||||
* ownCloud
|
||||
*
|
||||
* @author Thomas Müller
|
||||
* @copyright 2013 Thomas Müller deepdiver@owncloud.com
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 3 of the License, or any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU AFFERO GENERAL PUBLIC LICENSE for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public
|
||||
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
*/
|
||||
|
||||
namespace OCP\AppFramework;
|
||||
|
||||
use OCP\AppFramework\IApi;
|
||||
use OCP\IContainer;
|
||||
|
||||
/**
|
||||
* Class IAppContainer
|
||||
* @package OCP\AppFramework
|
||||
*
|
||||
* This container interface provides short cuts for app developers to access predefined app service.
|
||||
*/
|
||||
interface IAppContainer extends IContainer{
|
||||
|
||||
/**
|
||||
* used to return the appname of the set application
|
||||
* @return string the name of your application
|
||||
*/
|
||||
function getAppName();
|
||||
|
||||
/**
|
||||
* @return IApi
|
||||
*/
|
||||
function getCoreApi();
|
||||
|
||||
/**
|
||||
* @return \OCP\IServerContainer
|
||||
*/
|
||||
function getServer();
|
||||
|
||||
/**
|
||||
* @param IMiddleWare $middleWare
|
||||
* @return boolean
|
||||
*/
|
||||
function registerMiddleWare(IMiddleWare $middleWare);
|
||||
}
|
|
@ -0,0 +1,88 @@
|
|||
<?php
|
||||
|
||||
/**
|
||||
* ownCloud - App Framework
|
||||
*
|
||||
* @author Bernhard Posselt
|
||||
* @copyright 2012 Bernhard Posselt nukeawhale@gmail.com
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 3 of the License, or any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU AFFERO GENERAL PUBLIC LICENSE for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public
|
||||
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
*/
|
||||
|
||||
|
||||
namespace OCP\AppFramework;
|
||||
use OCP\AppFramework\Http\Response;
|
||||
|
||||
|
||||
/**
|
||||
* Middleware is used to provide hooks before or after controller methods and
|
||||
* deal with possible exceptions raised in the controller methods.
|
||||
* They're modeled after Django's middleware system:
|
||||
* https://docs.djangoproject.com/en/dev/topics/http/middleware/
|
||||
*/
|
||||
interface IMiddleWare {
|
||||
|
||||
|
||||
/**
|
||||
* This is being run in normal order before the controller is being
|
||||
* called which allows several modifications and checks
|
||||
*
|
||||
* @param Controller $controller the controller that is being called
|
||||
* @param string $methodName the name of the method that will be called on
|
||||
* the controller
|
||||
*/
|
||||
function beforeController($controller, $methodName);
|
||||
|
||||
|
||||
/**
|
||||
* This is being run when either the beforeController method or the
|
||||
* controller method itself is throwing an exception. The middleware is
|
||||
* asked in reverse order to handle the exception and to return a response.
|
||||
* If the response is null, it is assumed that the exception could not be
|
||||
* handled and the error will be thrown again
|
||||
*
|
||||
* @param Controller $controller the controller that is being called
|
||||
* @param string $methodName the name of the method that will be called on
|
||||
* the controller
|
||||
* @param \Exception $exception the thrown exception
|
||||
* @throws \Exception the passed in exception if it cant handle it
|
||||
* @return Response a Response object in case that the exception was handled
|
||||
*/
|
||||
function afterException($controller, $methodName, \Exception $exception);
|
||||
|
||||
/**
|
||||
* This is being run after a successful controller method call and allows
|
||||
* the manipulation of a Response object. The middleware is run in reverse order
|
||||
*
|
||||
* @param Controller $controller the controller that is being called
|
||||
* @param string $methodName the name of the method that will be called on
|
||||
* the controller
|
||||
* @param Response $response the generated response from the controller
|
||||
* @return Response a Response object
|
||||
*/
|
||||
function afterController($controller, $methodName, Response $response);
|
||||
|
||||
/**
|
||||
* This is being run after the response object has been rendered and
|
||||
* allows the manipulation of the output. The middleware is run in reverse order
|
||||
*
|
||||
* @param Controller $controller the controller that is being called
|
||||
* @param string $methodName the name of the method that will be called on
|
||||
* the controller
|
||||
* @param string $output the generated output from a response
|
||||
* @return string the output that should be printed
|
||||
*/
|
||||
function beforeOutput($controller, $methodName, $output);
|
||||
}
|
|
@ -90,13 +90,8 @@ namespace OCP {
|
|||
* @return array of contacts which are arrays of key-value-pairs
|
||||
*/
|
||||
public static function search($pattern, $searchProperties = array(), $options = array()) {
|
||||
$result = array();
|
||||
foreach(self::$address_books as $address_book) {
|
||||
$r = $address_book->search($pattern, $searchProperties, $options);
|
||||
$result = array_merge($result, $r);
|
||||
}
|
||||
|
||||
return $result;
|
||||
$cm = \OC::$server->getContactsManager();
|
||||
return $cm->search($pattern, $searchProperties, $options);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -107,14 +102,8 @@ namespace OCP {
|
|||
* @return bool successful or not
|
||||
*/
|
||||
public static function delete($id, $address_book_key) {
|
||||
if (!array_key_exists($address_book_key, self::$address_books))
|
||||
return null;
|
||||
|
||||
$address_book = self::$address_books[$address_book_key];
|
||||
if ($address_book->getPermissions() & \OCP\PERMISSION_DELETE)
|
||||
return null;
|
||||
|
||||
return $address_book->delete($id);
|
||||
$cm = \OC::$server->getContactsManager();
|
||||
return $cm->delete($id, $address_book_key);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -126,15 +115,8 @@ namespace OCP {
|
|||
* @return array representing the contact just created or updated
|
||||
*/
|
||||
public static function createOrUpdate($properties, $address_book_key) {
|
||||
|
||||
if (!array_key_exists($address_book_key, self::$address_books))
|
||||
return null;
|
||||
|
||||
$address_book = self::$address_books[$address_book_key];
|
||||
if ($address_book->getPermissions() & \OCP\PERMISSION_CREATE)
|
||||
return null;
|
||||
|
||||
return $address_book->createOrUpdate($properties);
|
||||
$cm = \OC::$server->getContactsManager();
|
||||
return $cm->search($properties, $address_book_key);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -143,45 +125,40 @@ namespace OCP {
|
|||
* @return bool true if enabled, false if not
|
||||
*/
|
||||
public static function isEnabled() {
|
||||
return !empty(self::$address_books);
|
||||
$cm = \OC::$server->getContactsManager();
|
||||
return $cm->isEnabled();
|
||||
}
|
||||
|
||||
/**
|
||||
* @param \OCP\IAddressBook $address_book
|
||||
*/
|
||||
public static function registerAddressBook(\OCP\IAddressBook $address_book) {
|
||||
self::$address_books[$address_book->getKey()] = $address_book;
|
||||
$cm = \OC::$server->getContactsManager();
|
||||
return $cm->registerAddressBook($address_book);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param \OCP\IAddressBook $address_book
|
||||
*/
|
||||
public static function unregisterAddressBook(\OCP\IAddressBook $address_book) {
|
||||
unset(self::$address_books[$address_book->getKey()]);
|
||||
$cm = \OC::$server->getContactsManager();
|
||||
return $cm->unregisterAddressBook($address_book);
|
||||
}
|
||||
|
||||
/**
|
||||
* @return array
|
||||
*/
|
||||
public static function getAddressBooks() {
|
||||
$result = array();
|
||||
foreach(self::$address_books as $address_book) {
|
||||
$result[$address_book->getKey()] = $address_book->getDisplayName();
|
||||
}
|
||||
|
||||
return $result;
|
||||
$cm = \OC::$server->getContactsManager();
|
||||
return $cm->getAddressBooks();
|
||||
}
|
||||
|
||||
/**
|
||||
* removes all registered address book instances
|
||||
*/
|
||||
public static function clear() {
|
||||
self::$address_books = array();
|
||||
$cm = \OC::$server->getContactsManager();
|
||||
$cm->clear();
|
||||
}
|
||||
|
||||
/**
|
||||
* @var \OCP\IAddressBook[] which holds all registered address books
|
||||
*/
|
||||
private static $address_books = array();
|
||||
}
|
||||
}
|
||||
|
|
|
@ -0,0 +1,150 @@
|
|||
<?php
|
||||
/**
|
||||
* ownCloud
|
||||
*
|
||||
* @author Thomas Müller
|
||||
* @copyright 2013 Thomas Müller thomas.mueller@tmit.eu
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 3 of the License, or any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU AFFERO GENERAL PUBLIC LICENSE for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public
|
||||
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
*/
|
||||
|
||||
/**
|
||||
* Public interface of ownCloud for apps to use.
|
||||
* Contacts Class
|
||||
*
|
||||
*/
|
||||
|
||||
// use OCP namespace for all classes that are considered public.
|
||||
// This means that they should be used by apps instead of the internal ownCloud classes
|
||||
namespace OCP\Contacts {
|
||||
|
||||
/**
|
||||
* This class provides access to the contacts app. Use this class exclusively if you want to access contacts.
|
||||
*
|
||||
* Contacts in general will be expressed as an array of key-value-pairs.
|
||||
* The keys will match the property names defined in https://tools.ietf.org/html/rfc2426#section-1
|
||||
*
|
||||
* Proposed workflow for working with contacts:
|
||||
* - search for the contacts
|
||||
* - manipulate the results array
|
||||
* - createOrUpdate will save the given contacts overwriting the existing data
|
||||
*
|
||||
* For updating it is mandatory to keep the id.
|
||||
* Without an id a new contact will be created.
|
||||
*
|
||||
*/
|
||||
interface IManager {
|
||||
|
||||
/**
|
||||
* This function is used to search and find contacts within the users address books.
|
||||
* In case $pattern is empty all contacts will be returned.
|
||||
*
|
||||
* Example:
|
||||
* Following function shows how to search for contacts for the name and the email address.
|
||||
*
|
||||
* public static function getMatchingRecipient($term) {
|
||||
* $cm = \OC::$server->getContactsManager();
|
||||
* // The API is not active -> nothing to do
|
||||
* if (!$cm->isEnabled()) {
|
||||
* return array();
|
||||
* }
|
||||
*
|
||||
* $result = $cm->search($term, array('FN', 'EMAIL'));
|
||||
* $receivers = array();
|
||||
* foreach ($result as $r) {
|
||||
* $id = $r['id'];
|
||||
* $fn = $r['FN'];
|
||||
* $email = $r['EMAIL'];
|
||||
* if (!is_array($email)) {
|
||||
* $email = array($email);
|
||||
* }
|
||||
*
|
||||
* // loop through all email addresses of this contact
|
||||
* foreach ($email as $e) {
|
||||
* $displayName = $fn . " <$e>";
|
||||
* $receivers[] = array(
|
||||
* 'id' => $id,
|
||||
* 'label' => $displayName,
|
||||
* 'value' => $displayName);
|
||||
* }
|
||||
* }
|
||||
*
|
||||
* return $receivers;
|
||||
* }
|
||||
*
|
||||
*
|
||||
* @param string $pattern which should match within the $searchProperties
|
||||
* @param array $searchProperties defines the properties within the query pattern should match
|
||||
* @param array $options - for future use. One should always have options!
|
||||
* @return array of contacts which are arrays of key-value-pairs
|
||||
*/
|
||||
function search($pattern, $searchProperties = array(), $options = array());
|
||||
|
||||
/**
|
||||
* This function can be used to delete the contact identified by the given id
|
||||
*
|
||||
* @param object $id the unique identifier to a contact
|
||||
* @param $address_book_key
|
||||
* @return bool successful or not
|
||||
*/
|
||||
function delete($id, $address_book_key);
|
||||
|
||||
/**
|
||||
* This function is used to create a new contact if 'id' is not given or not present.
|
||||
* Otherwise the contact will be updated by replacing the entire data set.
|
||||
*
|
||||
* @param array $properties this array if key-value-pairs defines a contact
|
||||
* @param $address_book_key string to identify the address book in which the contact shall be created or updated
|
||||
* @return array representing the contact just created or updated
|
||||
*/
|
||||
function createOrUpdate($properties, $address_book_key);
|
||||
|
||||
/**
|
||||
* Check if contacts are available (e.g. contacts app enabled)
|
||||
*
|
||||
* @return bool true if enabled, false if not
|
||||
*/
|
||||
function isEnabled();
|
||||
|
||||
/**
|
||||
* @param \OCP\IAddressBook $address_book
|
||||
*/
|
||||
function registerAddressBook(\OCP\IAddressBook $address_book);
|
||||
|
||||
/**
|
||||
* @param \OCP\IAddressBook $address_book
|
||||
*/
|
||||
function unregisterAddressBook(\OCP\IAddressBook $address_book);
|
||||
|
||||
/**
|
||||
* In order to improve lazy loading a closure can be registered which will be called in case
|
||||
* address books are actually requested
|
||||
*
|
||||
* @param string $key
|
||||
* @param \Closure $callable
|
||||
*/
|
||||
function register($key, \Closure $callable);
|
||||
|
||||
/**
|
||||
* @return array
|
||||
*/
|
||||
function getAddressBooks();
|
||||
|
||||
/**
|
||||
* removes all registered address book instances
|
||||
*/
|
||||
function clear();
|
||||
}
|
||||
}
|
|
@ -0,0 +1,55 @@
|
|||
<?php
|
||||
/**
|
||||
* Copyright (c) 2013 Thomas Tanghus (thomas@tanghus.net)
|
||||
* This file is licensed under the Affero General Public License version 3 or
|
||||
* later.
|
||||
* See the COPYING-README file.
|
||||
*/
|
||||
namespace OCP;
|
||||
|
||||
/**
|
||||
* This interface defines method for accessing the file based user cache.
|
||||
*/
|
||||
interface ICache {
|
||||
|
||||
/**
|
||||
* Get a value from the user cache
|
||||
*
|
||||
* @param string $key
|
||||
* @return mixed
|
||||
*/
|
||||
public function get($key);
|
||||
|
||||
/**
|
||||
* Set a value in the user cache
|
||||
*
|
||||
* @param string $key
|
||||
* @param mixed $value
|
||||
* @param int $ttl Time To Live in seconds. Defaults to 60*60*24
|
||||
* @return bool
|
||||
*/
|
||||
public function set($key, $value, $ttl = 0);
|
||||
|
||||
/**
|
||||
* Check if a value is set in the user cache
|
||||
*
|
||||
* @param string $key
|
||||
* @return bool
|
||||
*/
|
||||
public function hasKey($key);
|
||||
|
||||
/**
|
||||
* Remove an item from the user cache
|
||||
*
|
||||
* @param string $key
|
||||
* @return bool
|
||||
*/
|
||||
public function remove($key);
|
||||
|
||||
/**
|
||||
* clear the user cache of all entries starting with a prefix
|
||||
* @param string $prefix (optional)
|
||||
* @return bool
|
||||
*/
|
||||
public function clear($prefix = '');
|
||||
}
|
|
@ -0,0 +1,65 @@
|
|||
<?php
|
||||
/**
|
||||
* Copyright (c) 2013 Bart Visscher <bartv@thisnet.nl>
|
||||
* This file is licensed under the Affero General Public License version 3 or
|
||||
* later.
|
||||
* See the COPYING-README file.
|
||||
*
|
||||
*/
|
||||
|
||||
namespace OCP;
|
||||
|
||||
/**
|
||||
* Access to all the configuration options ownCloud offers
|
||||
*/
|
||||
interface IConfig {
|
||||
/**
|
||||
* Sets a new system wide value
|
||||
* @param string $key the key of the value, under which will be saved
|
||||
* @param string $value the value that should be stored
|
||||
* @todo need a use case for this
|
||||
*/
|
||||
// public function setSystemValue($key, $value);
|
||||
|
||||
/**
|
||||
* Looks up a system wide defined value
|
||||
* @param string $key the key of the value, under which it was saved
|
||||
* @return string the saved value
|
||||
*/
|
||||
public function getSystemValue($key);
|
||||
|
||||
|
||||
/**
|
||||
* Writes a new app wide value
|
||||
* @param string $appName the appName that we want to store the value under
|
||||
* @param string $key the key of the value, under which will be saved
|
||||
* @param string $value the value that should be stored
|
||||
*/
|
||||
public function setAppValue($appName, $key, $value);
|
||||
|
||||
/**
|
||||
* Looks up an app wide defined value
|
||||
* @param string $appName the appName that we stored the value under
|
||||
* @param string $key the key of the value, under which it was saved
|
||||
* @return string the saved value
|
||||
*/
|
||||
public function getAppValue($appName, $key);
|
||||
|
||||
|
||||
/**
|
||||
* Set a user defined value
|
||||
* @param string $userId the userId of the user that we want to store the value under
|
||||
* @param string $appName the appName that we want to store the value under
|
||||
* @param string $key the key under which the value is being stored
|
||||
* @param string $value the value that you want to store
|
||||
*/
|
||||
public function setUserValue($userId, $appName, $key, $value);
|
||||
|
||||
/**
|
||||
* Shortcut for getting a user defined value
|
||||
* @param string $userId the userId of the user that we want to store the value under
|
||||
* @param string $appName the appName that we stored the value under
|
||||
* @param string $key the key under which the value is being stored
|
||||
*/
|
||||
public function getUserValue($userId, $appName, $key);
|
||||
}
|
|
@ -0,0 +1,64 @@
|
|||
<?php
|
||||
/**
|
||||
* ownCloud
|
||||
*
|
||||
* @author Thomas Müller
|
||||
* @copyright 2013 Thomas Müller deepdiver@owncloud.com
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 3 of the License, or any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU AFFERO GENERAL PUBLIC LICENSE for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public
|
||||
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
*/
|
||||
|
||||
namespace OCP;
|
||||
|
||||
/**
|
||||
* Class IContainer
|
||||
*
|
||||
* IContainer is the basic interface to be used for any internal dependency injection mechanism
|
||||
*
|
||||
* @package OCP
|
||||
*/
|
||||
interface IContainer {
|
||||
|
||||
/**
|
||||
* Look up a service for a given name in the container.
|
||||
*
|
||||
* @param string $name
|
||||
* @return mixed
|
||||
*/
|
||||
function query($name);
|
||||
|
||||
/**
|
||||
* A value is stored in the container with it's corresponding name
|
||||
*
|
||||
* @param string $name
|
||||
* @param mixed $value
|
||||
* @return void
|
||||
*/
|
||||
function registerParameter($name, $value);
|
||||
|
||||
/**
|
||||
* A service is registered in the container where a closure is passed in which will actually
|
||||
* create the service on demand.
|
||||
* In case the parameter $shared is set to true (the default usage) the once created service will remain in
|
||||
* memory and be reused on subsequent calls.
|
||||
* In case the parameter is false the service will be recreated on every call.
|
||||
*
|
||||
* @param string $name
|
||||
* @param callable $closure
|
||||
* @param bool $shared
|
||||
* @return void
|
||||
*/
|
||||
function registerService($name, \Closure $closure, $shared = true);
|
||||
}
|
|
@ -0,0 +1,74 @@
|
|||
<?php
|
||||
/**
|
||||
* Copyright (c) 2013 Bart Visscher <bartv@thisnet.nl>
|
||||
* This file is licensed under the Affero General Public License version 3 or
|
||||
* later.
|
||||
* See the COPYING-README file.
|
||||
*
|
||||
*/
|
||||
|
||||
namespace OCP;
|
||||
|
||||
/**
|
||||
* TODO: Description
|
||||
*/
|
||||
interface IDBConnection {
|
||||
/**
|
||||
* Used to abstract the owncloud database access away
|
||||
* @param string $sql the sql query with ? placeholder for params
|
||||
* @param int $limit the maximum number of rows
|
||||
* @param int $offset from which row we want to start
|
||||
* @return \Doctrine\DBAL\Driver\Statement The prepared statement.
|
||||
*/
|
||||
public function prepare($sql, $limit=null, $offset=null);
|
||||
|
||||
/**
|
||||
* Used to get the id of the just inserted element
|
||||
* @param string $tableName the name of the table where we inserted the item
|
||||
* @return int the id of the inserted element
|
||||
*/
|
||||
public function lastInsertId($table = null);
|
||||
|
||||
/**
|
||||
* @brief Insert a row if a matching row doesn't exists.
|
||||
* @param $table string The table name (will replace *PREFIX*) to perform the replace on.
|
||||
* @param $input array
|
||||
*
|
||||
* The input array if in the form:
|
||||
*
|
||||
* array ( 'id' => array ( 'value' => 6,
|
||||
* 'key' => true
|
||||
* ),
|
||||
* 'name' => array ('value' => 'Stoyan'),
|
||||
* 'family' => array ('value' => 'Stefanov'),
|
||||
* 'birth_date' => array ('value' => '1975-06-20')
|
||||
* );
|
||||
* @return bool
|
||||
*
|
||||
*/
|
||||
public function insertIfNotExist($table, $input);
|
||||
|
||||
/**
|
||||
* @brief Start a transaction
|
||||
* @return bool TRUE on success or FALSE on failure
|
||||
*/
|
||||
public function beginTransaction();
|
||||
|
||||
/**
|
||||
* @brief Commit the database changes done during a transaction that is in progress
|
||||
* @return bool TRUE on success or FALSE on failure
|
||||
*/
|
||||
public function commit();
|
||||
|
||||
/**
|
||||
* @brief Rollback the database changes done during a transaction that is in progress
|
||||
* @return bool TRUE on success or FALSE on failure
|
||||
*/
|
||||
public function rollBack();
|
||||
|
||||
/**
|
||||
* returns the error code and message as a string for logging
|
||||
* @return string
|
||||
*/
|
||||
public function getError();
|
||||
}
|
|
@ -0,0 +1,27 @@
|
|||
<?php
|
||||
/**
|
||||
* Copyright (c) 2013 Bart Visscher <bartv@thisnet.nl>
|
||||
* This file is licensed under the Affero General Public License version 3 or
|
||||
* later.
|
||||
* See the COPYING-README file.
|
||||
*
|
||||
*/
|
||||
|
||||
namespace OCP;
|
||||
|
||||
/**
|
||||
* Manages the ownCloud navigation
|
||||
*/
|
||||
interface INavigationManager {
|
||||
/**
|
||||
* Creates a new navigation entry
|
||||
* @param array $entry containing: id, name, order, icon and href key
|
||||
*/
|
||||
public function add(array $entry);
|
||||
|
||||
/**
|
||||
* Sets the current navigation entry of the currently running app
|
||||
* @param string $appId id of the app entry to activate (from added $entry)
|
||||
*/
|
||||
public function setActiveEntry($appId);
|
||||
}
|
|
@ -0,0 +1,35 @@
|
|||
<?php
|
||||
/**
|
||||
* Copyright (c) 2013 Frank Karlitschek frank@owncloud.org
|
||||
* Copyright (c) 2013 Georg Ehrke georg@ownCloud.com
|
||||
* This file is licensed under the Affero General Public License version 3 or
|
||||
* later.
|
||||
* See the COPYING-README file.
|
||||
*/
|
||||
namespace OCP;
|
||||
|
||||
/**
|
||||
* This class provides functions to render and show thumbnails and previews of files
|
||||
*/
|
||||
interface IPreview
|
||||
{
|
||||
|
||||
/**
|
||||
* @brief return a preview of a file
|
||||
* @param string $file The path to the file where you want a thumbnail from
|
||||
* @param int $maxX The maximum X size of the thumbnail. It can be smaller depending on the shape of the image
|
||||
* @param int $maxY The maximum Y size of the thumbnail. It can be smaller depending on the shape of the image
|
||||
* @param boolean $scaleUp Scale smaller images up to the thumbnail size or not. Might look ugly
|
||||
* @return \OCP\Image
|
||||
*/
|
||||
function createPreview($file, $maxX = 100, $maxY = 75, $scaleUp = false);
|
||||
|
||||
|
||||
/**
|
||||
* @brief returns true if the passed mime type is supported
|
||||
* @param string $mimeType
|
||||
* @return boolean
|
||||
*/
|
||||
function isMimeSupported($mimeType = '*');
|
||||
|
||||
}
|
|
@ -0,0 +1,96 @@
|
|||
<?php
|
||||
/**
|
||||
* ownCloud
|
||||
*
|
||||
* @author Thomas Müller
|
||||
* @copyright 2013 Thomas Müller deepdiver@owncloud.com
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 3 of the License, or any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU AFFERO GENERAL PUBLIC LICENSE for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public
|
||||
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
*/
|
||||
|
||||
namespace OCP;
|
||||
|
||||
|
||||
interface IRequest {
|
||||
|
||||
function getHeader($name);
|
||||
|
||||
/**
|
||||
* Lets you access post and get parameters by the index
|
||||
* In case of json requests the encoded json body is accessed
|
||||
*
|
||||
* @param string $key the key which you want to access in the URL Parameter
|
||||
* placeholder, $_POST or $_GET array.
|
||||
* The priority how they're returned is the following:
|
||||
* 1. URL parameters
|
||||
* 2. POST parameters
|
||||
* 3. GET parameters
|
||||
* @param mixed $default If the key is not found, this value will be returned
|
||||
* @return mixed the content of the array
|
||||
*/
|
||||
public function getParam($key, $default = null);
|
||||
|
||||
|
||||
/**
|
||||
* Returns all params that were received, be it from the request
|
||||
*
|
||||
* (as GET or POST) or through the URL by the route
|
||||
* @return array the array with all parameters
|
||||
*/
|
||||
public function getParams();
|
||||
|
||||
/**
|
||||
* Returns the method of the request
|
||||
*
|
||||
* @return string the method of the request (POST, GET, etc)
|
||||
*/
|
||||
public function getMethod();
|
||||
|
||||
/**
|
||||
* Shortcut for accessing an uploaded file through the $_FILES array
|
||||
*
|
||||
* @param string $key the key that will be taken from the $_FILES array
|
||||
* @return array the file in the $_FILES element
|
||||
*/
|
||||
public function getUploadedFile($key);
|
||||
|
||||
|
||||
/**
|
||||
* Shortcut for getting env variables
|
||||
*
|
||||
* @param string $key the key that will be taken from the $_ENV array
|
||||
* @return array the value in the $_ENV element
|
||||
*/
|
||||
public function getEnv($key);
|
||||
|
||||
|
||||
/**
|
||||
* Shortcut for getting cookie variables
|
||||
*
|
||||
* @param string $key the key that will be taken from the $_COOKIE array
|
||||
* @return array the value in the $_COOKIE element
|
||||
*/
|
||||
function getCookie($key);
|
||||
|
||||
|
||||
/**
|
||||
* Returns the request body content.
|
||||
*
|
||||
* @param Boolean $asResource If true, a resource will be returned
|
||||
* @return string|resource The request body content or a resource to read the body stream.
|
||||
* @throws \LogicException
|
||||
*/
|
||||
function getContent($asResource = false);
|
||||
}
|
|
@ -0,0 +1,125 @@
|
|||
<?php
|
||||
/**
|
||||
* ownCloud
|
||||
*
|
||||
* @author Thomas Müller
|
||||
* @copyright 2013 Thomas Müller deepdiver@owncloud.com
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 3 of the License, or any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU AFFERO GENERAL PUBLIC LICENSE for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public
|
||||
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
*/
|
||||
|
||||
namespace OCP;
|
||||
|
||||
|
||||
/**
|
||||
* Class IServerContainer
|
||||
* @package OCP
|
||||
*
|
||||
* This container holds all ownCloud services
|
||||
*/
|
||||
interface IServerContainer {
|
||||
|
||||
/**
|
||||
* The contacts manager will act as a broker between consumers for contacts information and
|
||||
* providers which actual deliver the contact information.
|
||||
*
|
||||
* @return \OCP\Contacts\IManager
|
||||
*/
|
||||
function getContactsManager();
|
||||
|
||||
/**
|
||||
* The current request object holding all information about the request currently being processed
|
||||
* is returned from this method.
|
||||
* In case the current execution was not initiated by a web request null is returned
|
||||
*
|
||||
* @return \OCP\IRequest|null
|
||||
*/
|
||||
function getRequest();
|
||||
|
||||
/**
|
||||
* Returns the preview manager which can create preview images for a given file
|
||||
*
|
||||
* @return \OCP\IPreview
|
||||
*/
|
||||
function getPreviewManager();
|
||||
|
||||
/**
|
||||
* Returns the tag manager which can get and set tags for different object types
|
||||
*
|
||||
* @see \OCP\ITagManager::load()
|
||||
* @return \OCP\ITagManager
|
||||
*/
|
||||
function getTagManager();
|
||||
|
||||
/**
|
||||
* Returns the root folder of ownCloud's data directory
|
||||
*
|
||||
* @return \OCP\Files\Folder
|
||||
*/
|
||||
function getRootFolder();
|
||||
|
||||
/**
|
||||
* Returns a view to ownCloud's files folder
|
||||
*
|
||||
* @return \OCP\Files\Folder
|
||||
*/
|
||||
function getUserFolder();
|
||||
|
||||
/**
|
||||
* Returns an app-specific view in ownClouds data directory
|
||||
*
|
||||
* @return \OCP\Files\Folder
|
||||
*/
|
||||
function getAppFolder();
|
||||
|
||||
/**
|
||||
* Returns the user session
|
||||
*
|
||||
* @return \OCP\IUserSession
|
||||
*/
|
||||
function getUserSession();
|
||||
|
||||
/**
|
||||
* @return \OCP\INavigationManager
|
||||
*/
|
||||
function getNavigationManager();
|
||||
|
||||
/**
|
||||
* @return \OCP\IConfig
|
||||
*/
|
||||
function getConfig();
|
||||
|
||||
/**
|
||||
* Returns an ICache instance
|
||||
*
|
||||
* @return \OCP\ICache
|
||||
*/
|
||||
function getCache();
|
||||
|
||||
/**
|
||||
* Returns the current session
|
||||
*
|
||||
* @return \OCP\ISession
|
||||
*/
|
||||
function getSession();
|
||||
|
||||
/**
|
||||
* Returns the current session
|
||||
*
|
||||
* @return \OCP\IDBConnection
|
||||
*/
|
||||
function getDatabaseConnection();
|
||||
|
||||
}
|
|
@ -0,0 +1,56 @@
|
|||
<?php
|
||||
/**
|
||||
* Copyright (c) 2013 Thomas Tanghus (thomas@tanghus.net)
|
||||
* @author Thomas Tanghus
|
||||
* @author Robin Appelman
|
||||
* This file is licensed under the Affero General Public License version 3 or
|
||||
* later.
|
||||
* See the COPYING-README file.
|
||||
*/
|
||||
|
||||
namespace OCP;
|
||||
|
||||
/**
|
||||
* Interface ISession
|
||||
*
|
||||
* wrap PHP's internal session handling into the ISession interface
|
||||
*/
|
||||
interface ISession {
|
||||
|
||||
/**
|
||||
* Set a value in the session
|
||||
*
|
||||
* @param string $key
|
||||
* @param mixed $value
|
||||
*/
|
||||
public function set($key, $value);
|
||||
|
||||
/**
|
||||
* Get a value from the session
|
||||
*
|
||||
* @param string $key
|
||||
* @return mixed should return null if $key does not exist
|
||||
*/
|
||||
public function get($key);
|
||||
|
||||
/**
|
||||
* Check if a named key exists in the session
|
||||
*
|
||||
* @param string $key
|
||||
* @return bool
|
||||
*/
|
||||
public function exists($key);
|
||||
|
||||
/**
|
||||
* Remove a $key/$value pair from the session
|
||||
*
|
||||
* @param string $key
|
||||
*/
|
||||
public function remove($key);
|
||||
|
||||
/**
|
||||
* Reset and recreate the session
|
||||
*/
|
||||
public function clear();
|
||||
|
||||
}
|
|
@ -0,0 +1,48 @@
|
|||
<?php
|
||||
/**
|
||||
* ownCloud
|
||||
*
|
||||
* @author Thomas Tanghus
|
||||
* @copyright 2013 Thomas Tanghus <thomas@tanghus.net>
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 3 of the License, or any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU AFFERO GENERAL PUBLIC LICENSE for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public
|
||||
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
*/
|
||||
|
||||
/**
|
||||
* Factory class creating instances of \OCP\ITags
|
||||
*
|
||||
* A tag can be e.g. 'Family', 'Work', 'Chore', 'Special Occation' or
|
||||
* anything else that is either parsed from a vobject or that the user chooses
|
||||
* to add.
|
||||
* Tag names are not case-sensitive, but will be saved with the case they
|
||||
* are entered in. If a user already has a tag 'family' for a type, and
|
||||
* tries to add a tag named 'Family' it will be silently ignored.
|
||||
*/
|
||||
|
||||
namespace OCP;
|
||||
|
||||
interface ITagManager {
|
||||
|
||||
/**
|
||||
* Create a new \OCP\ITags instance and load tags from db.
|
||||
*
|
||||
* @see \OCP\ITags
|
||||
* @param string $type The type identifier e.g. 'contact' or 'event'.
|
||||
* @param array $defaultTags An array of default tags to be used if none are stored.
|
||||
* @return \OCP\ITags
|
||||
*/
|
||||
public function load($type, $defaultTags=array());
|
||||
|
||||
}
|
|
@ -0,0 +1,164 @@
|
|||
<?php
|
||||
/**
|
||||
* ownCloud
|
||||
*
|
||||
* @author Thomas Tanghus
|
||||
* @copyright 2013 Thomas Tanghus <thomas@tanghus.net>
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 3 of the License, or any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU AFFERO GENERAL PUBLIC LICENSE for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public
|
||||
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
*/
|
||||
|
||||
namespace OCP;
|
||||
|
||||
// FIXME: Where should I put this? Or should it be implemented as a Listener?
|
||||
\OC_Hook::connect('OC_User', 'post_deleteUser', 'OC\Tags', 'post_deleteUser');
|
||||
|
||||
/**
|
||||
* Class for easily tagging objects by their id
|
||||
*
|
||||
* A tag can be e.g. 'Family', 'Work', 'Chore', 'Special Occation' or
|
||||
* anything else that is either parsed from a vobject or that the user chooses
|
||||
* to add.
|
||||
* Tag names are not case-sensitive, but will be saved with the case they
|
||||
* are entered in. If a user already has a tag 'family' for a type, and
|
||||
* tries to add a tag named 'Family' it will be silently ignored.
|
||||
*/
|
||||
|
||||
interface ITags {
|
||||
|
||||
/**
|
||||
* Check if any tags are saved for this type and user.
|
||||
*
|
||||
* @return boolean.
|
||||
*/
|
||||
public function isEmpty();
|
||||
|
||||
/**
|
||||
* Get the tags for a specific user.
|
||||
*
|
||||
* This returns an array with id/name maps:
|
||||
* [
|
||||
* ['id' => 0, 'name' = 'First tag'],
|
||||
* ['id' => 1, 'name' = 'Second tag'],
|
||||
* ]
|
||||
*
|
||||
* @returns array
|
||||
*/
|
||||
public function getTags();
|
||||
|
||||
/**
|
||||
* Get the a list if items tagged with $tag.
|
||||
*
|
||||
* Throws an exception if the tag could not be found.
|
||||
*
|
||||
* @param string|integer $tag Tag id or name.
|
||||
* @return array An array of object ids or false on error.
|
||||
*/
|
||||
public function getIdsForTag($tag);
|
||||
|
||||
/**
|
||||
* Checks whether a tag is already saved.
|
||||
*
|
||||
* @param string $name The name to check for.
|
||||
* @return bool
|
||||
*/
|
||||
public function hasTag($name);
|
||||
|
||||
/**
|
||||
* Add a new tag.
|
||||
*
|
||||
* @param string $name A string with a name of the tag
|
||||
* @return int the id of the added tag or false if it already exists.
|
||||
*/
|
||||
public function add($name);
|
||||
|
||||
/**
|
||||
* Rename tag.
|
||||
*
|
||||
* @param string $from The name of the existing tag
|
||||
* @param string $to The new name of the tag.
|
||||
* @return bool
|
||||
*/
|
||||
public function rename($from, $to);
|
||||
|
||||
/**
|
||||
* Add a list of new tags.
|
||||
*
|
||||
* @param string[] $names A string with a name or an array of strings containing
|
||||
* the name(s) of the to add.
|
||||
* @param bool $sync When true, save the tags
|
||||
* @param int|null $id int Optional object id to add to this|these tag(s)
|
||||
* @return bool Returns false on error.
|
||||
*/
|
||||
public function addMultiple($names, $sync=false, $id = null);
|
||||
|
||||
/**
|
||||
* Delete tag/object relations from the db
|
||||
*
|
||||
* @param array $ids The ids of the objects
|
||||
* @return boolean Returns false on error.
|
||||
*/
|
||||
public function purgeObjects(array $ids);
|
||||
|
||||
/**
|
||||
* Get favorites for an object type
|
||||
*
|
||||
* @return array An array of object ids.
|
||||
*/
|
||||
public function getFavorites();
|
||||
|
||||
/**
|
||||
* Add an object to favorites
|
||||
*
|
||||
* @param int $objid The id of the object
|
||||
* @return boolean
|
||||
*/
|
||||
public function addToFavorites($objid);
|
||||
|
||||
/**
|
||||
* Remove an object from favorites
|
||||
*
|
||||
* @param int $objid The id of the object
|
||||
* @return boolean
|
||||
*/
|
||||
public function removeFromFavorites($objid);
|
||||
|
||||
/**
|
||||
* Creates a tag/object relation.
|
||||
*
|
||||
* @param int $objid The id of the object
|
||||
* @param int|string $tag The id or name of the tag
|
||||
* @return boolean Returns false on database error.
|
||||
*/
|
||||
public function tagAs($objid, $tag);
|
||||
|
||||
/**
|
||||
* Delete single tag/object relation from the db
|
||||
*
|
||||
* @param int $objid The id of the object
|
||||
* @param int|string $tag The id or name of the tag
|
||||
* @return boolean
|
||||
*/
|
||||
public function unTag($objid, $tag);
|
||||
|
||||
/**
|
||||
* Delete tags from the
|
||||
*
|
||||
* @param string[] $names An array of tags to delete
|
||||
* @return bool Returns false on error
|
||||
*/
|
||||
public function delete($names);
|
||||
|
||||
}
|
|
@ -0,0 +1,30 @@
|
|||
<?php
|
||||
/**
|
||||
* Copyright (c) 2013 Bart Visscher <bartv@thisnet.nl>
|
||||
* This file is licensed under the Affero General Public License version 3 or
|
||||
* later.
|
||||
* See the COPYING-README file.
|
||||
*
|
||||
*/
|
||||
|
||||
namespace OCP;
|
||||
|
||||
/**
|
||||
* User session
|
||||
*/
|
||||
interface IUserSession {
|
||||
/**
|
||||
* Do a user login
|
||||
* @param string $user the username
|
||||
* @param string $password the password
|
||||
* @return bool true if successful
|
||||
*/
|
||||
public function login($user, $password);
|
||||
|
||||
/**
|
||||
* @brief Logs the user out including all the session data
|
||||
* Logout, destroys session
|
||||
*/
|
||||
public function logout();
|
||||
|
||||
}
|
|
@ -1,34 +0,0 @@
|
|||
<?php
|
||||
/**
|
||||
* Copyright (c) 2013 Frank Karlitschek frank@owncloud.org
|
||||
* Copyright (c) 2013 Georg Ehrke georg@ownCloud.com
|
||||
* This file is licensed under the Affero General Public License version 3 or
|
||||
* later.
|
||||
* See the COPYING-README file.
|
||||
*/
|
||||
namespace OCP;
|
||||
|
||||
/**
|
||||
* This class provides functions to render and show thumbnails and previews of files
|
||||
*/
|
||||
class Preview {
|
||||
|
||||
/**
|
||||
* @brief return a preview of a file
|
||||
* @param $file The path to the file where you want a thumbnail from
|
||||
* @param $maxX The maximum X size of the thumbnail. It can be smaller depending on the shape of the image
|
||||
* @param $maxY The maximum Y size of the thumbnail. It can be smaller depending on the shape of the image
|
||||
* @param $scaleup Scale smaller images up to the thumbnail size or not. Might look ugly
|
||||
* @return image
|
||||
*/
|
||||
public static function show($file,$maxX=100,$maxY=75,$scaleup=false) {
|
||||
return(\OC\Preview::show($file,$maxX,$maxY,$scaleup));
|
||||
}
|
||||
|
||||
|
||||
|
||||
public static function isMimeSupported($mimetype='*') {
|
||||
return \OC\Preview::isMimeSupported($mimetype);
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,255 @@
|
|||
<?php
|
||||
|
||||
namespace OC;
|
||||
|
||||
use OC\AppFramework\Http\Request;
|
||||
use OC\AppFramework\Utility\SimpleContainer;
|
||||
use OC\Cache\UserCache;
|
||||
use OC\Files\Node\Root;
|
||||
use OC\Files\View;
|
||||
use OCP\IServerContainer;
|
||||
|
||||
/**
|
||||
* Class Server
|
||||
* @package OC
|
||||
*
|
||||
* TODO: hookup all manager classes
|
||||
*/
|
||||
class Server extends SimpleContainer implements IServerContainer {
|
||||
|
||||
function __construct() {
|
||||
$this->registerService('ContactsManager', function($c) {
|
||||
return new ContactsManager();
|
||||
});
|
||||
$this->registerService('Request', function($c) {
|
||||
$params = array();
|
||||
|
||||
// we json decode the body only in case of content type json
|
||||
if (isset($_SERVER['CONTENT_TYPE']) && stripos($_SERVER['CONTENT_TYPE'],'json') !== false ) {
|
||||
$params = json_decode(file_get_contents('php://input'), true);
|
||||
$params = is_array($params) ? $params: array();
|
||||
}
|
||||
|
||||
return new Request(
|
||||
array(
|
||||
'get' => $_GET,
|
||||
'post' => $_POST,
|
||||
'files' => $_FILES,
|
||||
'server' => $_SERVER,
|
||||
'env' => $_ENV,
|
||||
'cookies' => $_COOKIE,
|
||||
'method' => (isset($_SERVER) && isset($_SERVER['REQUEST_METHOD']))
|
||||
? $_SERVER['REQUEST_METHOD']
|
||||
: null,
|
||||
'params' => $params,
|
||||
'urlParams' => $c['urlParams']
|
||||
)
|
||||
);
|
||||
});
|
||||
$this->registerService('PreviewManager', function($c) {
|
||||
return new PreviewManager();
|
||||
});
|
||||
$this->registerService('TagManager', function($c) {
|
||||
$user = \OC_User::getUser();
|
||||
return new TagManager($user);
|
||||
});
|
||||
$this->registerService('RootFolder', function($c) {
|
||||
// TODO: get user and user manager from container as well
|
||||
$user = \OC_User::getUser();
|
||||
/** @var $c SimpleContainer */
|
||||
$userManager = $c->query('UserManager');
|
||||
$user = $userManager->get($user);
|
||||
$manager = \OC\Files\Filesystem::getMountManager();
|
||||
$view = new View();
|
||||
return new Root($manager, $view, $user);
|
||||
});
|
||||
$this->registerService('UserManager', function($c) {
|
||||
return new \OC\User\Manager();
|
||||
});
|
||||
$this->registerService('UserSession', function($c) {
|
||||
/** @var $c SimpleContainer */
|
||||
$manager = $c->query('UserManager');
|
||||
$userSession = new \OC\User\Session($manager, \OC::$session);
|
||||
$userSession->listen('\OC\User', 'preCreateUser', function ($uid, $password) {
|
||||
\OC_Hook::emit('OC_User', 'pre_createUser', array('run' => true, 'uid' => $uid, 'password' => $password));
|
||||
});
|
||||
$userSession->listen('\OC\User', 'postCreateUser', function ($user, $password) {
|
||||
/** @var $user \OC\User\User */
|
||||
\OC_Hook::emit('OC_User', 'post_createUser', array('uid' => $user->getUID(), 'password' => $password));
|
||||
});
|
||||
$userSession->listen('\OC\User', 'preDelete', function ($user) {
|
||||
/** @var $user \OC\User\User */
|
||||
\OC_Hook::emit('OC_User', 'pre_deleteUser', array('run' => true, 'uid' => $user->getUID()));
|
||||
});
|
||||
$userSession->listen('\OC\User', 'postDelete', function ($user) {
|
||||
/** @var $user \OC\User\User */
|
||||
\OC_Hook::emit('OC_User', 'post_deleteUser', array('uid' => $user->getUID()));
|
||||
});
|
||||
$userSession->listen('\OC\User', 'preSetPassword', function ($user, $password, $recoveryPassword) {
|
||||
/** @var $user \OC\User\User */
|
||||
\OC_Hook::emit('OC_User', 'pre_setPassword', array('run' => true, 'uid' => $user->getUID(), 'password' => $password, 'recoveryPassword' => $recoveryPassword));
|
||||
});
|
||||
$userSession->listen('\OC\User', 'postSetPassword', function ($user, $password, $recoveryPassword) {
|
||||
/** @var $user \OC\User\User */
|
||||
\OC_Hook::emit('OC_User', 'post_setPassword', array('run' => true, 'uid' => $user->getUID(), 'password' => $password, 'recoveryPassword' => $recoveryPassword));
|
||||
});
|
||||
$userSession->listen('\OC\User', 'preLogin', function ($uid, $password) {
|
||||
\OC_Hook::emit('OC_User', 'pre_login', array('run' => true, 'uid' => $uid, 'password' => $password));
|
||||
});
|
||||
$userSession->listen('\OC\User', 'postLogin', function ($user, $password) {
|
||||
/** @var $user \OC\User\User */
|
||||
\OC_Hook::emit('OC_User', 'post_login', array('run' => true, 'uid' => $user->getUID(), 'password' => $password));
|
||||
});
|
||||
$userSession->listen('\OC\User', 'logout', function () {
|
||||
\OC_Hook::emit('OC_User', 'logout', array());
|
||||
});
|
||||
return $userSession;
|
||||
});
|
||||
$this->registerService('NavigationManager', function($c) {
|
||||
return new \OC\NavigationManager();
|
||||
});
|
||||
$this->registerService('AllConfig', function($c) {
|
||||
return new \OC\AllConfig();
|
||||
});
|
||||
$this->registerService('UserCache', function($c) {
|
||||
return new UserCache();
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* @return \OCP\Contacts\IManager
|
||||
*/
|
||||
function getContactsManager() {
|
||||
return $this->query('ContactsManager');
|
||||
}
|
||||
|
||||
/**
|
||||
* The current request object holding all information about the request
|
||||
* currently being processed is returned from this method.
|
||||
* In case the current execution was not initiated by a web request null is returned
|
||||
*
|
||||
* @return \OCP\IRequest|null
|
||||
*/
|
||||
function getRequest() {
|
||||
return $this->query('Request');
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the preview manager which can create preview images for a given file
|
||||
*
|
||||
* @return \OCP\IPreview
|
||||
*/
|
||||
function getPreviewManager() {
|
||||
return $this->query('PreviewManager');
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the tag manager which can get and set tags for different object types
|
||||
*
|
||||
* @see \OCP\ITagManager::load()
|
||||
* @return \OCP\ITagManager
|
||||
*/
|
||||
function getTagManager() {
|
||||
return $this->query('TagManager');
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the root folder of ownCloud's data directory
|
||||
*
|
||||
* @return \OCP\Files\Folder
|
||||
*/
|
||||
function getRootFolder() {
|
||||
return $this->query('RootFolder');
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns a view to ownCloud's files folder
|
||||
*
|
||||
* @return \OCP\Files\Folder
|
||||
*/
|
||||
function getUserFolder() {
|
||||
|
||||
$dir = '/files';
|
||||
$root = $this->getRootFolder();
|
||||
$folder = null;
|
||||
if(!$root->nodeExists($dir)) {
|
||||
$folder = $root->newFolder($dir);
|
||||
} else {
|
||||
$folder = $root->get($dir);
|
||||
}
|
||||
return $folder;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns an app-specific view in ownClouds data directory
|
||||
*
|
||||
* @return \OCP\Files\Folder
|
||||
*/
|
||||
function getAppFolder() {
|
||||
|
||||
$dir = '/' . \OC_App::getCurrentApp();
|
||||
$root = $this->getRootFolder();
|
||||
$folder = null;
|
||||
if(!$root->nodeExists($dir)) {
|
||||
$folder = $root->newFolder($dir);
|
||||
} else {
|
||||
$folder = $root->get($dir);
|
||||
}
|
||||
return $folder;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return \OC\User\Manager
|
||||
*/
|
||||
function getUserManager() {
|
||||
return $this->query('UserManager');
|
||||
}
|
||||
|
||||
/**
|
||||
* @return \OC\User\Session
|
||||
*/
|
||||
function getUserSession() {
|
||||
return $this->query('UserSession');
|
||||
}
|
||||
|
||||
/**
|
||||
* @return \OC\NavigationManager
|
||||
*/
|
||||
function getNavigationManager() {
|
||||
return $this->query('NavigationManager');
|
||||
}
|
||||
|
||||
/**
|
||||
* @return \OC\Config
|
||||
*/
|
||||
function getConfig() {
|
||||
return $this->query('AllConfig');
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns an ICache instance
|
||||
*
|
||||
* @return \OCP\ICache
|
||||
*/
|
||||
function getCache() {
|
||||
return $this->query('UserCache');
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the current session
|
||||
*
|
||||
* @return \OCP\ISession
|
||||
*/
|
||||
function getSession() {
|
||||
return \OC::$session;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the current session
|
||||
*
|
||||
* @return \OCP\IDBConnection
|
||||
*/
|
||||
function getDatabaseConnection() {
|
||||
return \OC_DB::getConnection();
|
||||
}
|
||||
}
|
|
@ -8,7 +8,7 @@
|
|||
|
||||
namespace OC\Session;
|
||||
|
||||
abstract class Session implements \ArrayAccess {
|
||||
abstract class Session implements \ArrayAccess, \OCP\ISession {
|
||||
/**
|
||||
* $name serves as a namespace for the session keys
|
||||
*
|
||||
|
|
|
@ -0,0 +1,68 @@
|
|||
<?php
|
||||
/**
|
||||
* ownCloud
|
||||
*
|
||||
* @author Thomas Tanghus
|
||||
* @copyright 2013 Thomas Tanghus <thomas@tanghus.net>
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 3 of the License, or any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU AFFERO GENERAL PUBLIC LICENSE for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public
|
||||
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
*/
|
||||
|
||||
/**
|
||||
* Factory class creating instances of \OCP\ITags
|
||||
*
|
||||
* A tag can be e.g. 'Family', 'Work', 'Chore', 'Special Occation' or
|
||||
* anything else that is either parsed from a vobject or that the user chooses
|
||||
* to add.
|
||||
* Tag names are not case-sensitive, but will be saved with the case they
|
||||
* are entered in. If a user already has a tag 'family' for a type, and
|
||||
* tries to add a tag named 'Family' it will be silently ignored.
|
||||
*/
|
||||
|
||||
namespace OC;
|
||||
|
||||
class TagManager implements \OCP\ITagManager {
|
||||
|
||||
/**
|
||||
* User
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
private $user = null;
|
||||
|
||||
/**
|
||||
* Constructor.
|
||||
*
|
||||
* @param string $user The user whos data the object will operate on.
|
||||
*/
|
||||
public function __construct($user) {
|
||||
|
||||
$this->user = $user;
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Create a new \OCP\ITags instance and load tags from db.
|
||||
*
|
||||
* @see \OCP\ITags
|
||||
* @param string $type The type identifier e.g. 'contact' or 'event'.
|
||||
* @param array $defaultTags An array of default tags to be used if none are stored.
|
||||
* @return \OCP\ITags
|
||||
*/
|
||||
public function load($type, $defaultTags=array()) {
|
||||
return new Tags($this->user, $type, $defaultTags);
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,642 @@
|
|||
<?php
|
||||
/**
|
||||
* ownCloud
|
||||
*
|
||||
* @author Thomas Tanghus
|
||||
* @copyright 2012-2013 Thomas Tanghus <thomas@tanghus.net>
|
||||
* @copyright 2012 Bart Visscher bartv@thisnet.nl
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 3 of the License, or any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU AFFERO GENERAL PUBLIC LICENSE for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public
|
||||
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
*/
|
||||
|
||||
/**
|
||||
* Class for easily tagging objects by their id
|
||||
*
|
||||
* A tag can be e.g. 'Family', 'Work', 'Chore', 'Special Occation' or
|
||||
* anything else that is either parsed from a vobject or that the user chooses
|
||||
* to add.
|
||||
* Tag names are not case-sensitive, but will be saved with the case they
|
||||
* are entered in. If a user already has a tag 'family' for a type, and
|
||||
* tries to add a tag named 'Family' it will be silently ignored.
|
||||
*/
|
||||
|
||||
namespace OC;
|
||||
|
||||
class Tags implements \OCP\ITags {
|
||||
|
||||
/**
|
||||
* Tags
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
private $tags = array();
|
||||
|
||||
/**
|
||||
* Used for storing objectid/categoryname pairs while rescanning.
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
private static $relations = array();
|
||||
|
||||
/**
|
||||
* Type
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
private $type = null;
|
||||
|
||||
/**
|
||||
* User
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
private $user = null;
|
||||
|
||||
const TAG_TABLE = '*PREFIX*vcategory';
|
||||
const RELATION_TABLE = '*PREFIX*vcategory_to_object';
|
||||
|
||||
const TAG_FAVORITE = '_$!<Favorite>!$_';
|
||||
|
||||
/**
|
||||
* Constructor.
|
||||
*
|
||||
* @param string $user The user whos data the object will operate on.
|
||||
*/
|
||||
public function __construct($user, $type, $defaultTags = array()) {
|
||||
$this->user = $user;
|
||||
$this->type = $type;
|
||||
$this->loadTags($defaultTags);
|
||||
}
|
||||
|
||||
/**
|
||||
* Load tags from db.
|
||||
*
|
||||
* @param string $type The type identifier e.g. 'contact' or 'event'.
|
||||
* @param array $defaultTags An array of default tags to be used if none are stored.
|
||||
*/
|
||||
protected function loadTags($defaultTags=array()) {
|
||||
$this->tags = array();
|
||||
$result = null;
|
||||
$sql = 'SELECT `id`, `category` FROM `' . self::TAG_TABLE . '` '
|
||||
. 'WHERE `uid` = ? AND `type` = ? ORDER BY `category`';
|
||||
try {
|
||||
$stmt = \OCP\DB::prepare($sql);
|
||||
$result = $stmt->execute(array($this->user, $this->type));
|
||||
if (\OCP\DB::isError($result)) {
|
||||
\OCP\Util::writeLog('core', __METHOD__. ', DB error: ' . \OCP\DB::getErrorMessage($result), \OCP\Util::ERROR);
|
||||
}
|
||||
} catch(\Exception $e) {
|
||||
\OCP\Util::writeLog('core', __METHOD__.', exception: '.$e->getMessage(),
|
||||
\OCP\Util::ERROR);
|
||||
}
|
||||
|
||||
if(!is_null($result)) {
|
||||
while( $row = $result->fetchRow()) {
|
||||
$this->tags[$row['id']] = $row['category'];
|
||||
}
|
||||
}
|
||||
|
||||
if(count($defaultTags) > 0 && count($this->tags) === 0) {
|
||||
$this->addMultiple($defaultTags, true);
|
||||
}
|
||||
\OCP\Util::writeLog('core', __METHOD__.', tags: ' . print_r($this->tags, true),
|
||||
\OCP\Util::DEBUG);
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Check if any tags are saved for this type and user.
|
||||
*
|
||||
* @return boolean.
|
||||
*/
|
||||
public function isEmpty() {
|
||||
$sql = 'SELECT COUNT(*) FROM `' . self::TAG_TABLE . '` '
|
||||
. 'WHERE `uid` = ? AND `type` = ?';
|
||||
try {
|
||||
$stmt = \OCP\DB::prepare($sql);
|
||||
$result = $stmt->execute(array($this->user, $this->type));
|
||||
if (\OCP\DB::isError($result)) {
|
||||
\OCP\Util::writeLog('core', __METHOD__. ', DB error: ' . \OCP\DB::getErrorMessage($result), \OCP\Util::ERROR);
|
||||
return false;
|
||||
}
|
||||
return ((int)$result->fetchOne() === 0);
|
||||
} catch(\Exception $e) {
|
||||
\OCP\Util::writeLog('core', __METHOD__.', exception: '.$e->getMessage(),
|
||||
\OCP\Util::ERROR);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the tags for a specific user.
|
||||
*
|
||||
* This returns an array with id/name maps:
|
||||
* [
|
||||
* ['id' => 0, 'name' = 'First tag'],
|
||||
* ['id' => 1, 'name' = 'Second tag'],
|
||||
* ]
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
public function getTags() {
|
||||
if(!count($this->tags)) {
|
||||
return array();
|
||||
}
|
||||
|
||||
$tags = array_values($this->tags);
|
||||
uasort($tags, 'strnatcasecmp');
|
||||
$tagMap = array();
|
||||
|
||||
foreach($tags as $tag) {
|
||||
if($tag !== self::TAG_FAVORITE) {
|
||||
$tagMap[] = array(
|
||||
'id' => $this->array_searchi($tag, $this->tags),
|
||||
'name' => $tag
|
||||
);
|
||||
}
|
||||
}
|
||||
return $tagMap;
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the a list if items tagged with $tag.
|
||||
*
|
||||
* Throws an exception if the tag could not be found.
|
||||
*
|
||||
* @param string|integer $tag Tag id or name.
|
||||
* @return array An array of object ids or false on error.
|
||||
*/
|
||||
public function getIdsForTag($tag) {
|
||||
$result = null;
|
||||
if(is_numeric($tag)) {
|
||||
$tagId = $tag;
|
||||
} elseif(is_string($tag)) {
|
||||
$tag = trim($tag);
|
||||
$tagId = $this->array_searchi($tag, $this->tags);
|
||||
}
|
||||
|
||||
if($tagId === false) {
|
||||
$l10n = \OC_L10N::get('core');
|
||||
throw new \Exception(
|
||||
$l10n->t('Could not find category "%s"', $tag)
|
||||
);
|
||||
}
|
||||
|
||||
$ids = array();
|
||||
$sql = 'SELECT `objid` FROM `' . self::RELATION_TABLE
|
||||
. '` WHERE `categoryid` = ?';
|
||||
|
||||
try {
|
||||
$stmt = \OCP\DB::prepare($sql);
|
||||
$result = $stmt->execute(array($tagId));
|
||||
if (\OCP\DB::isError($result)) {
|
||||
\OCP\Util::writeLog('core', __METHOD__. 'DB error: ' . \OCP\DB::getErrorMessage($result), \OCP\Util::ERROR);
|
||||
return false;
|
||||
}
|
||||
} catch(\Exception $e) {
|
||||
\OCP\Util::writeLog('core', __METHOD__.', exception: '.$e->getMessage(),
|
||||
\OCP\Util::ERROR);
|
||||
return false;
|
||||
}
|
||||
|
||||
if(!is_null($result)) {
|
||||
while( $row = $result->fetchRow()) {
|
||||
$ids[] = (int)$row['objid'];
|
||||
}
|
||||
}
|
||||
|
||||
return $ids;
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks whether a tag is already saved.
|
||||
*
|
||||
* @param string $name The name to check for.
|
||||
* @return bool
|
||||
*/
|
||||
public function hasTag($name) {
|
||||
return $this->in_arrayi($name, $this->tags);
|
||||
}
|
||||
|
||||
/**
|
||||
* Add a new tag.
|
||||
*
|
||||
* @param string $name A string with a name of the tag
|
||||
* @return int the id of the added tag or false if it already exists.
|
||||
*/
|
||||
public function add($name) {
|
||||
$name = trim($name);
|
||||
|
||||
if($this->hasTag($name)) {
|
||||
\OCP\Util::writeLog('core', __METHOD__.', name: ' . $name. ' exists already', \OCP\Util::DEBUG);
|
||||
return false;
|
||||
}
|
||||
try {
|
||||
$result = \OCP\DB::insertIfNotExist(
|
||||
self::TAG_TABLE,
|
||||
array(
|
||||
'uid' => $this->user,
|
||||
'type' => $this->type,
|
||||
'category' => $name,
|
||||
)
|
||||
);
|
||||
if (\OCP\DB::isError($result)) {
|
||||
\OCP\Util::writeLog('core', __METHOD__. 'DB error: ' . \OCP\DB::getErrorMessage($result), \OCP\Util::ERROR);
|
||||
return false;
|
||||
} elseif((int)$result === 0) {
|
||||
\OCP\Util::writeLog('core', __METHOD__.', Tag already exists: ' . $name, \OCP\Util::DEBUG);
|
||||
return false;
|
||||
}
|
||||
} catch(\Exception $e) {
|
||||
\OCP\Util::writeLog('core', __METHOD__.', exception: '.$e->getMessage(),
|
||||
\OCP\Util::ERROR);
|
||||
return false;
|
||||
}
|
||||
$id = \OCP\DB::insertid(self::TAG_TABLE);
|
||||
\OCP\Util::writeLog('core', __METHOD__.', id: ' . $id, \OCP\Util::DEBUG);
|
||||
$this->tags[$id] = $name;
|
||||
return $id;
|
||||
}
|
||||
|
||||
/**
|
||||
* Rename tag.
|
||||
*
|
||||
* @param string $from The name of the existing tag
|
||||
* @param string $to The new name of the tag.
|
||||
* @return bool
|
||||
*/
|
||||
public function rename($from, $to) {
|
||||
$from = trim($from);
|
||||
$to = trim($to);
|
||||
$id = $this->array_searchi($from, $this->tags);
|
||||
if($id === false) {
|
||||
\OCP\Util::writeLog('core', __METHOD__.', tag: ' . $from. ' does not exist', \OCP\Util::DEBUG);
|
||||
return false;
|
||||
}
|
||||
|
||||
$sql = 'UPDATE `' . self::TAG_TABLE . '` SET `category` = ? '
|
||||
. 'WHERE `uid` = ? AND `type` = ? AND `id` = ?';
|
||||
try {
|
||||
$stmt = \OCP\DB::prepare($sql);
|
||||
$result = $stmt->execute(array($to, $this->user, $this->type, $id));
|
||||
if (\OCP\DB::isError($result)) {
|
||||
\OCP\Util::writeLog('core', __METHOD__. 'DB error: ' . \OCP\DB::getErrorMessage($result), \OCP\Util::ERROR);
|
||||
return false;
|
||||
}
|
||||
} catch(\Exception $e) {
|
||||
\OCP\Util::writeLog('core', __METHOD__.', exception: '.$e->getMessage(),
|
||||
\OCP\Util::ERROR);
|
||||
return false;
|
||||
}
|
||||
$this->tags[$id] = $to;
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Add a list of new tags.
|
||||
*
|
||||
* @param string[] $names A string with a name or an array of strings containing
|
||||
* the name(s) of the to add.
|
||||
* @param bool $sync When true, save the tags
|
||||
* @param int|null $id int Optional object id to add to this|these tag(s)
|
||||
* @return bool Returns false on error.
|
||||
*/
|
||||
public function addMultiple($names, $sync=false, $id = null) {
|
||||
if(!is_array($names)) {
|
||||
$names = array($names);
|
||||
}
|
||||
$names = array_map('trim', $names);
|
||||
$newones = array();
|
||||
foreach($names as $name) {
|
||||
if(($this->in_arrayi(
|
||||
$name, $this->tags) == false) && $name !== '') {
|
||||
$newones[] = $name;
|
||||
}
|
||||
if(!is_null($id) ) {
|
||||
// Insert $objectid, $categoryid pairs if not exist.
|
||||
self::$relations[] = array('objid' => $id, 'tag' => $name);
|
||||
}
|
||||
}
|
||||
$this->tags = array_merge($this->tags, $newones);
|
||||
if($sync === true) {
|
||||
$this->save();
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Save the list of tags and their object relations
|
||||
*/
|
||||
protected function save() {
|
||||
if(is_array($this->tags)) {
|
||||
foreach($this->tags as $tag) {
|
||||
try {
|
||||
\OCP\DB::insertIfNotExist(self::TAG_TABLE,
|
||||
array(
|
||||
'uid' => $this->user,
|
||||
'type' => $this->type,
|
||||
'category' => $tag,
|
||||
));
|
||||
} catch(\Exception $e) {
|
||||
\OCP\Util::writeLog('core', __METHOD__.', exception: '.$e->getMessage(),
|
||||
\OCP\Util::ERROR);
|
||||
}
|
||||
}
|
||||
// reload tags to get the proper ids.
|
||||
$this->loadTags();
|
||||
// Loop through temporarily cached objectid/tagname pairs
|
||||
// and save relations.
|
||||
$tags = $this->tags;
|
||||
// For some reason this is needed or array_search(i) will return 0..?
|
||||
ksort($tags);
|
||||
foreach(self::$relations as $relation) {
|
||||
$tagId = $this->array_searchi($relation['tag'], $tags);
|
||||
\OCP\Util::writeLog('core', __METHOD__ . 'catid, ' . $relation['tag'] . ' ' . $tagId, \OCP\Util::DEBUG);
|
||||
if($tagId) {
|
||||
try {
|
||||
\OCP\DB::insertIfNotExist(self::RELATION_TABLE,
|
||||
array(
|
||||
'objid' => $relation['objid'],
|
||||
'categoryid' => $tagId,
|
||||
'type' => $this->type,
|
||||
));
|
||||
} catch(\Exception $e) {
|
||||
\OCP\Util::writeLog('core', __METHOD__.', exception: '.$e->getMessage(),
|
||||
\OCP\Util::ERROR);
|
||||
}
|
||||
}
|
||||
}
|
||||
self::$relations = array(); // reset
|
||||
} else {
|
||||
\OCP\Util::writeLog('core', __METHOD__.', $this->tags is not an array! '
|
||||
. print_r($this->tags, true), \OCP\Util::ERROR);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Delete tags and tag/object relations for a user.
|
||||
*
|
||||
* For hooking up on post_deleteUser
|
||||
*
|
||||
* @param array
|
||||
*/
|
||||
public static function post_deleteUser($arguments) {
|
||||
// Find all objectid/tagId pairs.
|
||||
$result = null;
|
||||
try {
|
||||
$stmt = \OCP\DB::prepare('SELECT `id` FROM `' . self::TAG_TABLE . '` '
|
||||
. 'WHERE `uid` = ?');
|
||||
$result = $stmt->execute(array($arguments['uid']));
|
||||
if (\OCP\DB::isError($result)) {
|
||||
\OCP\Util::writeLog('core', __METHOD__. 'DB error: ' . \OCP\DB::getErrorMessage($result), \OCP\Util::ERROR);
|
||||
}
|
||||
} catch(\Exception $e) {
|
||||
\OCP\Util::writeLog('core', __METHOD__.', exception: '.$e->getMessage(),
|
||||
\OCP\Util::ERROR);
|
||||
}
|
||||
|
||||
if(!is_null($result)) {
|
||||
try {
|
||||
$stmt = \OCP\DB::prepare('DELETE FROM `' . self::RELATION_TABLE . '` '
|
||||
. 'WHERE `categoryid` = ?');
|
||||
while( $row = $result->fetchRow()) {
|
||||
try {
|
||||
$stmt->execute(array($row['id']));
|
||||
} catch(\Exception $e) {
|
||||
\OCP\Util::writeLog('core', __METHOD__.', exception: '.$e->getMessage(),
|
||||
\OCP\Util::ERROR);
|
||||
}
|
||||
}
|
||||
} catch(\Exception $e) {
|
||||
\OCP\Util::writeLog('core', __METHOD__.', exception: '.$e->getMessage(),
|
||||
\OCP\Util::ERROR);
|
||||
}
|
||||
}
|
||||
try {
|
||||
$stmt = \OCP\DB::prepare('DELETE FROM `' . self::TAG_TABLE . '` '
|
||||
. 'WHERE `uid` = ?');
|
||||
$result = $stmt->execute(array($arguments['uid']));
|
||||
if (\OCP\DB::isError($result)) {
|
||||
\OCP\Util::writeLog('core', __METHOD__. ', DB error: ' . \OCP\DB::getErrorMessage($result), \OCP\Util::ERROR);
|
||||
}
|
||||
} catch(\Exception $e) {
|
||||
\OCP\Util::writeLog('core', __METHOD__ . ', exception: '
|
||||
. $e->getMessage(), \OCP\Util::ERROR);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Delete tag/object relations from the db
|
||||
*
|
||||
* @param array $ids The ids of the objects
|
||||
* @return boolean Returns false on error.
|
||||
*/
|
||||
public function purgeObjects(array $ids) {
|
||||
if(count($ids) === 0) {
|
||||
// job done ;)
|
||||
return true;
|
||||
}
|
||||
$updates = $ids;
|
||||
try {
|
||||
$query = 'DELETE FROM `' . self::RELATION_TABLE . '` ';
|
||||
$query .= 'WHERE `objid` IN (' . str_repeat('?,', count($ids)-1) . '?) ';
|
||||
$query .= 'AND `type`= ?';
|
||||
$updates[] = $this->type;
|
||||
$stmt = \OCP\DB::prepare($query);
|
||||
$result = $stmt->execute($updates);
|
||||
if (\OCP\DB::isError($result)) {
|
||||
\OCP\Util::writeLog('core', __METHOD__. 'DB error: ' . \OCP\DB::getErrorMessage($result), \OCP\Util::ERROR);
|
||||
return false;
|
||||
}
|
||||
} catch(\Exception $e) {
|
||||
\OCP\Util::writeLog('core', __METHOD__.', exception: ' . $e->getMessage(),
|
||||
\OCP\Util::ERROR);
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get favorites for an object type
|
||||
*
|
||||
* @return array An array of object ids.
|
||||
*/
|
||||
public function getFavorites() {
|
||||
try {
|
||||
return $this->getIdsForTag(self::TAG_FAVORITE);
|
||||
} catch(\Exception $e) {
|
||||
\OCP\Util::writeLog('core', __METHOD__.', exception: ' . $e->getMessage(),
|
||||
\OCP\Util::ERROR);
|
||||
return array();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Add an object to favorites
|
||||
*
|
||||
* @param int $objid The id of the object
|
||||
* @return boolean
|
||||
*/
|
||||
public function addToFavorites($objid) {
|
||||
if(!$this->hasTag(self::TAG_FAVORITE)) {
|
||||
$this->add(self::TAG_FAVORITE, true);
|
||||
}
|
||||
return $this->tagAs($objid, self::TAG_FAVORITE, $this->type);
|
||||
}
|
||||
|
||||
/**
|
||||
* Remove an object from favorites
|
||||
*
|
||||
* @param int $objid The id of the object
|
||||
* @return boolean
|
||||
*/
|
||||
public function removeFromFavorites($objid) {
|
||||
return $this->unTag($objid, self::TAG_FAVORITE, $this->type);
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates a tag/object relation.
|
||||
*
|
||||
* @param int $objid The id of the object
|
||||
* @param int|string $tag The id or name of the tag
|
||||
* @return boolean Returns false on database error.
|
||||
*/
|
||||
public function tagAs($objid, $tag) {
|
||||
if(is_string($tag) && !is_numeric($tag)) {
|
||||
$tag = trim($tag);
|
||||
if(!$this->hasTag($tag)) {
|
||||
$this->add($tag, true);
|
||||
}
|
||||
$tagId = $this->array_searchi($tag, $this->tags);
|
||||
} else {
|
||||
$tagId = $tag;
|
||||
}
|
||||
try {
|
||||
\OCP\DB::insertIfNotExist(self::RELATION_TABLE,
|
||||
array(
|
||||
'objid' => $objid,
|
||||
'categoryid' => $tagId,
|
||||
'type' => $this->type,
|
||||
));
|
||||
} catch(\Exception $e) {
|
||||
\OCP\Util::writeLog('core', __METHOD__.', exception: '.$e->getMessage(),
|
||||
\OCP\Util::ERROR);
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Delete single tag/object relation from the db
|
||||
*
|
||||
* @param int $objid The id of the object
|
||||
* @param int|string $tag The id or name of the tag
|
||||
* @return boolean
|
||||
*/
|
||||
public function unTag($objid, $tag) {
|
||||
if(is_string($tag) && !is_numeric($tag)) {
|
||||
$tag = trim($tag);
|
||||
$tagId = $this->array_searchi($tag, $this->tags);
|
||||
} else {
|
||||
$tagId = $tag;
|
||||
}
|
||||
|
||||
try {
|
||||
$sql = 'DELETE FROM `' . self::RELATION_TABLE . '` '
|
||||
. 'WHERE `objid` = ? AND `categoryid` = ? AND `type` = ?';
|
||||
$stmt = \OCP\DB::prepare($sql);
|
||||
$stmt->execute(array($objid, $tagId, $this->type));
|
||||
} catch(\Exception $e) {
|
||||
\OCP\Util::writeLog('core', __METHOD__.', exception: '.$e->getMessage(),
|
||||
\OCP\Util::ERROR);
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Delete tags from the
|
||||
*
|
||||
* @param string[] $names An array of tags to delete
|
||||
* @return bool Returns false on error
|
||||
*/
|
||||
public function delete($names) {
|
||||
if(!is_array($names)) {
|
||||
$names = array($names);
|
||||
}
|
||||
|
||||
$names = array_map('trim', $names);
|
||||
|
||||
\OCP\Util::writeLog('core', __METHOD__ . ', before: '
|
||||
. print_r($this->tags, true), \OCP\Util::DEBUG);
|
||||
foreach($names as $name) {
|
||||
$id = null;
|
||||
|
||||
if($this->hasTag($name)) {
|
||||
$id = $this->array_searchi($name, $this->tags);
|
||||
unset($this->tags[$id]);
|
||||
}
|
||||
try {
|
||||
$stmt = \OCP\DB::prepare('DELETE FROM `' . self::TAG_TABLE . '` WHERE '
|
||||
. '`uid` = ? AND `type` = ? AND `category` = ?');
|
||||
$result = $stmt->execute(array($this->user, $this->type, $name));
|
||||
if (\OCP\DB::isError($result)) {
|
||||
\OCP\Util::writeLog('core', __METHOD__. 'DB error: ' . \OCP\DB::getErrorMessage($result), \OCP\Util::ERROR);
|
||||
}
|
||||
} catch(\Exception $e) {
|
||||
\OCP\Util::writeLog('core', __METHOD__ . ', exception: '
|
||||
. $e->getMessage(), \OCP\Util::ERROR);
|
||||
return false;
|
||||
}
|
||||
if(!is_null($id) && $id !== false) {
|
||||
try {
|
||||
$sql = 'DELETE FROM `' . self::RELATION_TABLE . '` '
|
||||
. 'WHERE `categoryid` = ?';
|
||||
$stmt = \OCP\DB::prepare($sql);
|
||||
$result = $stmt->execute(array($id));
|
||||
if (\OCP\DB::isError($result)) {
|
||||
\OCP\Util::writeLog('core',
|
||||
__METHOD__. 'DB error: ' . \OCP\DB::getErrorMessage($result),
|
||||
\OCP\Util::ERROR);
|
||||
return false;
|
||||
}
|
||||
} catch(\Exception $e) {
|
||||
\OCP\Util::writeLog('core', __METHOD__.', exception: '.$e->getMessage(),
|
||||
\OCP\Util::ERROR);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
// case-insensitive in_array
|
||||
private function in_arrayi($needle, $haystack) {
|
||||
if(!is_array($haystack)) {
|
||||
return false;
|
||||
}
|
||||
return in_array(strtolower($needle), array_map('strtolower', $haystack));
|
||||
}
|
||||
|
||||
// case-insensitive array_search
|
||||
private function array_searchi($needle, $haystack) {
|
||||
if(!is_array($haystack)) {
|
||||
return false;
|
||||
}
|
||||
return array_search(strtolower($needle), array_map('strtolower', $haystack));
|
||||
}
|
||||
}
|
43
lib/user.php
43
lib/user.php
|
@ -37,54 +37,15 @@
|
|||
* logout()
|
||||
*/
|
||||
class OC_User {
|
||||
public static $userSession = null;
|
||||
|
||||
public static function getUserSession() {
|
||||
if (!self::$userSession) {
|
||||
$manager = new \OC\User\Manager();
|
||||
self::$userSession = new \OC\User\Session($manager, \OC::$session);
|
||||
self::$userSession->listen('\OC\User', 'preCreateUser', function ($uid, $password) {
|
||||
\OC_Hook::emit('OC_User', 'pre_createUser', array('run' => true, 'uid' => $uid, 'password' => $password));
|
||||
});
|
||||
self::$userSession->listen('\OC\User', 'postCreateUser', function ($user, $password) {
|
||||
/** @var $user \OC\User\User */
|
||||
\OC_Hook::emit('OC_User', 'post_createUser', array('uid' => $user->getUID(), 'password' => $password));
|
||||
});
|
||||
self::$userSession->listen('\OC\User', 'preDelete', function ($user) {
|
||||
/** @var $user \OC\User\User */
|
||||
\OC_Hook::emit('OC_User', 'pre_deleteUser', array('run' => true, 'uid' => $user->getUID()));
|
||||
});
|
||||
self::$userSession->listen('\OC\User', 'postDelete', function ($user) {
|
||||
/** @var $user \OC\User\User */
|
||||
\OC_Hook::emit('OC_User', 'post_deleteUser', array('uid' => $user->getUID()));
|
||||
});
|
||||
self::$userSession->listen('\OC\User', 'preSetPassword', function ($user, $password, $recoveryPassword) {
|
||||
/** @var $user \OC\User\User */
|
||||
OC_Hook::emit('OC_User', 'pre_setPassword', array('run' => true, 'uid' => $user->getUID(), 'password' => $password, 'recoveryPassword' => $recoveryPassword));
|
||||
});
|
||||
self::$userSession->listen('\OC\User', 'postSetPassword', function ($user, $password, $recoveryPassword) {
|
||||
/** @var $user \OC\User\User */
|
||||
OC_Hook::emit('OC_User', 'post_setPassword', array('run' => true, 'uid' => $user->getUID(), 'password' => $password, 'recoveryPassword' => $recoveryPassword));
|
||||
});
|
||||
self::$userSession->listen('\OC\User', 'preLogin', function ($uid, $password) {
|
||||
\OC_Hook::emit('OC_User', 'pre_login', array('run' => true, 'uid' => $uid, 'password' => $password));
|
||||
});
|
||||
self::$userSession->listen('\OC\User', 'postLogin', function ($user, $password) {
|
||||
/** @var $user \OC\User\User */
|
||||
\OC_Hook::emit('OC_User', 'post_login', array('run' => true, 'uid' => $user->getUID(), 'password' => $password));
|
||||
});
|
||||
self::$userSession->listen('\OC\User', 'logout', function () {
|
||||
\OC_Hook::emit('OC_User', 'logout', array());
|
||||
});
|
||||
}
|
||||
return self::$userSession;
|
||||
return OC::$server->getUserSession();
|
||||
}
|
||||
|
||||
/**
|
||||
* @return \OC\User\Manager
|
||||
*/
|
||||
public static function getManager() {
|
||||
return self::getUserSession()->getManager();
|
||||
return OC::$server->getUserManager();
|
||||
}
|
||||
|
||||
private static $_backends = array();
|
||||
|
|
|
@ -27,7 +27,7 @@ use OC\Hooks\Emitter;
|
|||
*
|
||||
* @package OC\User
|
||||
*/
|
||||
class Session implements Emitter {
|
||||
class Session implements Emitter, \OCP\IUserSession {
|
||||
/**
|
||||
* @var \OC\User\Manager $manager
|
||||
*/
|
||||
|
|
|
@ -1,821 +0,0 @@
|
|||
<?php
|
||||
/**
|
||||
* ownCloud
|
||||
*
|
||||
* @author Thomas Tanghus
|
||||
* @copyright 2012 Thomas Tanghus <thomas@tanghus.net>
|
||||
* @copyright 2012 Bart Visscher bartv@thisnet.nl
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 3 of the License, or any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU AFFERO GENERAL PUBLIC LICENSE for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public
|
||||
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
*/
|
||||
|
||||
OC_Hook::connect('OC_User', 'post_deleteUser', 'OC_VCategories', 'post_deleteUser');
|
||||
|
||||
/**
|
||||
* Class for easy access to categories in VCARD, VEVENT, VTODO and VJOURNAL.
|
||||
* A Category can be e.g. 'Family', 'Work', 'Chore', 'Special Occation' or
|
||||
* anything else that is either parsed from a vobject or that the user chooses
|
||||
* to add.
|
||||
* Category names are not case-sensitive, but will be saved with the case they
|
||||
* are entered in. If a user already has a category 'family' for a type, and
|
||||
* tries to add a category named 'Family' it will be silently ignored.
|
||||
*/
|
||||
class OC_VCategories {
|
||||
|
||||
/**
|
||||
* Categories
|
||||
*/
|
||||
private $categories = array();
|
||||
|
||||
/**
|
||||
* Used for storing objectid/categoryname pairs while rescanning.
|
||||
*/
|
||||
private static $relations = array();
|
||||
|
||||
private $type = null;
|
||||
private $user = null;
|
||||
|
||||
const CATEGORY_TABLE = '*PREFIX*vcategory';
|
||||
const RELATION_TABLE = '*PREFIX*vcategory_to_object';
|
||||
|
||||
const CATEGORY_FAVORITE = '_$!<Favorite>!$_';
|
||||
|
||||
const FORMAT_LIST = 0;
|
||||
const FORMAT_MAP = 1;
|
||||
|
||||
/**
|
||||
* @brief Constructor.
|
||||
* @param $type The type identifier e.g. 'contact' or 'event'.
|
||||
* @param $user The user whos data the object will operate on. This
|
||||
* parameter should normally be omitted but to make an app able to
|
||||
* update categories for all users it is made possible to provide it.
|
||||
* @param $defcategories An array of default categories to be used if none is stored.
|
||||
*/
|
||||
public function __construct($type, $user=null, $defcategories=array()) {
|
||||
$this->type = $type;
|
||||
$this->user = is_null($user) ? OC_User::getUser() : $user;
|
||||
|
||||
$this->loadCategories();
|
||||
OCP\Util::writeLog('core', __METHOD__ . ', categories: '
|
||||
. print_r($this->categories, true),
|
||||
OCP\Util::DEBUG
|
||||
);
|
||||
|
||||
if($defcategories && count($this->categories) === 0) {
|
||||
$this->addMulti($defcategories, true);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Load categories from db.
|
||||
*/
|
||||
private function loadCategories() {
|
||||
$this->categories = array();
|
||||
$result = null;
|
||||
$sql = 'SELECT `id`, `category` FROM `' . self::CATEGORY_TABLE . '` '
|
||||
. 'WHERE `uid` = ? AND `type` = ? ORDER BY `category`';
|
||||
try {
|
||||
$stmt = OCP\DB::prepare($sql);
|
||||
$result = $stmt->execute(array($this->user, $this->type));
|
||||
if (OC_DB::isError($result)) {
|
||||
OC_Log::write('core', __METHOD__. 'DB error: ' . OC_DB::getErrorMessage($result), OC_Log::ERROR);
|
||||
}
|
||||
} catch(Exception $e) {
|
||||
OCP\Util::writeLog('core', __METHOD__.', exception: '.$e->getMessage(),
|
||||
OCP\Util::ERROR);
|
||||
}
|
||||
|
||||
if(!is_null($result)) {
|
||||
while( $row = $result->fetchRow()) {
|
||||
// The keys are prefixed because array_search wouldn't work otherwise :-/
|
||||
$this->categories[$row['id']] = $row['category'];
|
||||
}
|
||||
}
|
||||
OCP\Util::writeLog('core', __METHOD__.', categories: ' . print_r($this->categories, true),
|
||||
OCP\Util::DEBUG);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @brief Check if any categories are saved for this type and user.
|
||||
* @returns boolean.
|
||||
* @param $type The type identifier e.g. 'contact' or 'event'.
|
||||
* @param $user The user whos categories will be checked. If not set current user will be used.
|
||||
*/
|
||||
public static function isEmpty($type, $user = null) {
|
||||
$user = is_null($user) ? OC_User::getUser() : $user;
|
||||
$sql = 'SELECT COUNT(*) FROM `' . self::CATEGORY_TABLE . '` '
|
||||
. 'WHERE `uid` = ? AND `type` = ?';
|
||||
try {
|
||||
$stmt = OCP\DB::prepare($sql);
|
||||
$result = $stmt->execute(array($user, $type));
|
||||
if (OC_DB::isError($result)) {
|
||||
OC_Log::write('core', __METHOD__. 'DB error: ' . OC_DB::getErrorMessage($result), OC_Log::ERROR);
|
||||
return false;
|
||||
}
|
||||
return ($result->numRows() === 0);
|
||||
} catch(Exception $e) {
|
||||
OCP\Util::writeLog('core', __METHOD__.', exception: '.$e->getMessage(),
|
||||
OCP\Util::ERROR);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Get the categories for a specific user.
|
||||
* @param
|
||||
* @returns array containing the categories as strings.
|
||||
*/
|
||||
public function categories($format = null) {
|
||||
if(!$this->categories) {
|
||||
return array();
|
||||
}
|
||||
$categories = array_values($this->categories);
|
||||
uasort($categories, 'strnatcasecmp');
|
||||
if($format == self::FORMAT_MAP) {
|
||||
$catmap = array();
|
||||
foreach($categories as $category) {
|
||||
if($category !== self::CATEGORY_FAVORITE) {
|
||||
$catmap[] = array(
|
||||
'id' => $this->array_searchi($category, $this->categories),
|
||||
'name' => $category
|
||||
);
|
||||
}
|
||||
}
|
||||
return $catmap;
|
||||
}
|
||||
|
||||
// Don't add favorites to normal categories.
|
||||
$favpos = array_search(self::CATEGORY_FAVORITE, $categories);
|
||||
if($favpos !== false) {
|
||||
return array_splice($categories, $favpos);
|
||||
} else {
|
||||
return $categories;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the a list if items belonging to $category.
|
||||
*
|
||||
* Throws an exception if the category could not be found.
|
||||
*
|
||||
* @param string|integer $category Category id or name.
|
||||
* @returns array An array of object ids or false on error.
|
||||
*/
|
||||
public function idsForCategory($category) {
|
||||
$result = null;
|
||||
if(is_numeric($category)) {
|
||||
$catid = $category;
|
||||
} elseif(is_string($category)) {
|
||||
$catid = $this->array_searchi($category, $this->categories);
|
||||
}
|
||||
OCP\Util::writeLog('core', __METHOD__.', category: '.$catid.' '.$category, OCP\Util::DEBUG);
|
||||
if($catid === false) {
|
||||
$l10n = OC_L10N::get('core');
|
||||
throw new Exception(
|
||||
$l10n->t('Could not find category "%s"', $category)
|
||||
);
|
||||
}
|
||||
|
||||
$ids = array();
|
||||
$sql = 'SELECT `objid` FROM `' . self::RELATION_TABLE
|
||||
. '` WHERE `categoryid` = ?';
|
||||
|
||||
try {
|
||||
$stmt = OCP\DB::prepare($sql);
|
||||
$result = $stmt->execute(array($catid));
|
||||
if (OC_DB::isError($result)) {
|
||||
OC_Log::write('core', __METHOD__. 'DB error: ' . OC_DB::getErrorMessage($result), OC_Log::ERROR);
|
||||
return false;
|
||||
}
|
||||
} catch(Exception $e) {
|
||||
OCP\Util::writeLog('core', __METHOD__.', exception: '.$e->getMessage(),
|
||||
OCP\Util::ERROR);
|
||||
return false;
|
||||
}
|
||||
|
||||
if(!is_null($result)) {
|
||||
while( $row = $result->fetchRow()) {
|
||||
$ids[] = (int)$row['objid'];
|
||||
}
|
||||
}
|
||||
|
||||
return $ids;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the a list if items belonging to $category.
|
||||
*
|
||||
* Throws an exception if the category could not be found.
|
||||
*
|
||||
* @param string|integer $category Category id or name.
|
||||
* @param array $tableinfo Array in the form {'tablename' => table, 'fields' => ['field1', 'field2']}
|
||||
* @param int $limit
|
||||
* @param int $offset
|
||||
*
|
||||
* This generic method queries a table assuming that the id
|
||||
* field is called 'id' and the table name provided is in
|
||||
* the form '*PREFIX*table_name'.
|
||||
*
|
||||
* If the category name cannot be resolved an exception is thrown.
|
||||
*
|
||||
* TODO: Maybe add the getting permissions for objects?
|
||||
*
|
||||
* @returns array containing the resulting items or false on error.
|
||||
*/
|
||||
public function itemsForCategory($category, $tableinfo, $limit = null, $offset = null) {
|
||||
$result = null;
|
||||
if(is_numeric($category)) {
|
||||
$catid = $category;
|
||||
} elseif(is_string($category)) {
|
||||
$catid = $this->array_searchi($category, $this->categories);
|
||||
}
|
||||
OCP\Util::writeLog('core', __METHOD__.', category: '.$catid.' '.$category, OCP\Util::DEBUG);
|
||||
if($catid === false) {
|
||||
$l10n = OC_L10N::get('core');
|
||||
throw new Exception(
|
||||
$l10n->t('Could not find category "%s"', $category)
|
||||
);
|
||||
}
|
||||
$fields = '';
|
||||
foreach($tableinfo['fields'] as $field) {
|
||||
$fields .= '`' . $tableinfo['tablename'] . '`.`' . $field . '`,';
|
||||
}
|
||||
$fields = substr($fields, 0, -1);
|
||||
|
||||
$items = array();
|
||||
$sql = 'SELECT `' . self::RELATION_TABLE . '`.`categoryid`, ' . $fields
|
||||
. ' FROM `' . $tableinfo['tablename'] . '` JOIN `'
|
||||
. self::RELATION_TABLE . '` ON `' . $tableinfo['tablename']
|
||||
. '`.`id` = `' . self::RELATION_TABLE . '`.`objid` WHERE `'
|
||||
. self::RELATION_TABLE . '`.`categoryid` = ?';
|
||||
|
||||
try {
|
||||
$stmt = OCP\DB::prepare($sql, $limit, $offset);
|
||||
$result = $stmt->execute(array($catid));
|
||||
if (OC_DB::isError($result)) {
|
||||
OC_Log::write('core', __METHOD__. 'DB error: ' . OC_DB::getErrorMessage($result), OC_Log::ERROR);
|
||||
return false;
|
||||
}
|
||||
} catch(Exception $e) {
|
||||
OCP\Util::writeLog('core', __METHOD__.', exception: '.$e->getMessage(),
|
||||
OCP\Util::ERROR);
|
||||
return false;
|
||||
}
|
||||
|
||||
if(!is_null($result)) {
|
||||
while( $row = $result->fetchRow()) {
|
||||
$items[] = $row;
|
||||
}
|
||||
}
|
||||
//OCP\Util::writeLog('core', __METHOD__.', count: ' . count($items), OCP\Util::DEBUG);
|
||||
//OCP\Util::writeLog('core', __METHOD__.', sql: ' . $sql, OCP\Util::DEBUG);
|
||||
|
||||
return $items;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Checks whether a category is already saved.
|
||||
* @param $name The name to check for.
|
||||
* @returns bool
|
||||
*/
|
||||
public function hasCategory($name) {
|
||||
return $this->in_arrayi($name, $this->categories);
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Add a new category.
|
||||
* @param $name A string with a name of the category
|
||||
* @returns int the id of the added category or false if it already exists.
|
||||
*/
|
||||
public function add($name) {
|
||||
OCP\Util::writeLog('core', __METHOD__.', name: ' . $name, OCP\Util::DEBUG);
|
||||
if($this->hasCategory($name)) {
|
||||
OCP\Util::writeLog('core', __METHOD__.', name: ' . $name. ' exists already', OCP\Util::DEBUG);
|
||||
return false;
|
||||
}
|
||||
try {
|
||||
OCP\DB::insertIfNotExist(self::CATEGORY_TABLE,
|
||||
array(
|
||||
'uid' => $this->user,
|
||||
'type' => $this->type,
|
||||
'category' => $name,
|
||||
));
|
||||
} catch(Exception $e) {
|
||||
OCP\Util::writeLog('core', __METHOD__.', exception: '.$e->getMessage(),
|
||||
OCP\Util::ERROR);
|
||||
return false;
|
||||
}
|
||||
$id = OCP\DB::insertid(self::CATEGORY_TABLE);
|
||||
OCP\Util::writeLog('core', __METHOD__.', id: ' . $id, OCP\Util::DEBUG);
|
||||
$this->categories[$id] = $name;
|
||||
return $id;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Rename category.
|
||||
* @param string $from The name of the existing category
|
||||
* @param string $to The new name of the category.
|
||||
* @returns bool
|
||||
*/
|
||||
public function rename($from, $to) {
|
||||
$id = $this->array_searchi($from, $this->categories);
|
||||
if($id === false) {
|
||||
OCP\Util::writeLog('core', __METHOD__.', category: ' . $from. ' does not exist', OCP\Util::DEBUG);
|
||||
return false;
|
||||
}
|
||||
|
||||
$sql = 'UPDATE `' . self::CATEGORY_TABLE . '` SET `category` = ? '
|
||||
. 'WHERE `uid` = ? AND `type` = ? AND `id` = ?';
|
||||
try {
|
||||
$stmt = OCP\DB::prepare($sql);
|
||||
$result = $stmt->execute(array($to, $this->user, $this->type, $id));
|
||||
if (OC_DB::isError($result)) {
|
||||
OC_Log::write('core', __METHOD__. 'DB error: ' . OC_DB::getErrorMessage($result), OC_Log::ERROR);
|
||||
return false;
|
||||
}
|
||||
} catch(Exception $e) {
|
||||
OCP\Util::writeLog('core', __METHOD__.', exception: '.$e->getMessage(),
|
||||
OCP\Util::ERROR);
|
||||
return false;
|
||||
}
|
||||
$this->categories[$id] = $to;
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Add a new category.
|
||||
* @param $names A string with a name or an array of strings containing
|
||||
* the name(s) of the categor(y|ies) to add.
|
||||
* @param $sync bool When true, save the categories
|
||||
* @param $id int Optional object id to add to this|these categor(y|ies)
|
||||
* @returns bool Returns false on error.
|
||||
*/
|
||||
public function addMulti($names, $sync=false, $id = null) {
|
||||
if(!is_array($names)) {
|
||||
$names = array($names);
|
||||
}
|
||||
$names = array_map('trim', $names);
|
||||
$newones = array();
|
||||
foreach($names as $name) {
|
||||
if(($this->in_arrayi(
|
||||
$name, $this->categories) == false) && $name != '') {
|
||||
$newones[] = $name;
|
||||
}
|
||||
if(!is_null($id) ) {
|
||||
// Insert $objectid, $categoryid pairs if not exist.
|
||||
self::$relations[] = array('objid' => $id, 'category' => $name);
|
||||
}
|
||||
}
|
||||
$this->categories = array_merge($this->categories, $newones);
|
||||
if($sync === true) {
|
||||
$this->save();
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Extracts categories from a vobject and add the ones not already present.
|
||||
* @param $vobject The instance of OC_VObject to load the categories from.
|
||||
*/
|
||||
public function loadFromVObject($id, $vobject, $sync=false) {
|
||||
$this->addMulti($vobject->getAsArray('CATEGORIES'), $sync, $id);
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Reset saved categories and rescan supplied vobjects for categories.
|
||||
* @param $objects An array of vobjects (as text).
|
||||
* To get the object array, do something like:
|
||||
* // For Addressbook:
|
||||
* $categories = new OC_VCategories('contacts');
|
||||
* $stmt = OC_DB::prepare( 'SELECT `carddata` FROM `*PREFIX*contacts_cards`' );
|
||||
* $result = $stmt->execute();
|
||||
* $objects = array();
|
||||
* if(!is_null($result)) {
|
||||
* while( $row = $result->fetchRow()){
|
||||
* $objects[] = array($row['id'], $row['carddata']);
|
||||
* }
|
||||
* }
|
||||
* $categories->rescan($objects);
|
||||
*/
|
||||
public function rescan($objects, $sync=true, $reset=true) {
|
||||
|
||||
if($reset === true) {
|
||||
$result = null;
|
||||
// Find all objectid/categoryid pairs.
|
||||
try {
|
||||
$stmt = OCP\DB::prepare('SELECT `id` FROM `' . self::CATEGORY_TABLE . '` '
|
||||
. 'WHERE `uid` = ? AND `type` = ?');
|
||||
$result = $stmt->execute(array($this->user, $this->type));
|
||||
if (OC_DB::isError($result)) {
|
||||
OC_Log::write('core', __METHOD__. 'DB error: ' . OC_DB::getErrorMessage($result), OC_Log::ERROR);
|
||||
return false;
|
||||
}
|
||||
} catch(Exception $e) {
|
||||
OCP\Util::writeLog('core', __METHOD__.', exception: '.$e->getMessage(),
|
||||
OCP\Util::ERROR);
|
||||
}
|
||||
|
||||
// And delete them.
|
||||
if(!is_null($result)) {
|
||||
$stmt = OCP\DB::prepare('DELETE FROM `' . self::RELATION_TABLE . '` '
|
||||
. 'WHERE `categoryid` = ? AND `type`= ?');
|
||||
while( $row = $result->fetchRow()) {
|
||||
$stmt->execute(array($row['id'], $this->type));
|
||||
}
|
||||
}
|
||||
try {
|
||||
$stmt = OCP\DB::prepare('DELETE FROM `' . self::CATEGORY_TABLE . '` '
|
||||
. 'WHERE `uid` = ? AND `type` = ?');
|
||||
$result = $stmt->execute(array($this->user, $this->type));
|
||||
if (OC_DB::isError($result)) {
|
||||
OC_Log::write('core', __METHOD__. 'DB error: ' . OC_DB::getErrorMessage($result), OC_Log::ERROR);
|
||||
return;
|
||||
}
|
||||
} catch(Exception $e) {
|
||||
OCP\Util::writeLog('core', __METHOD__ . ', exception: '
|
||||
. $e->getMessage(), OCP\Util::ERROR);
|
||||
return;
|
||||
}
|
||||
$this->categories = array();
|
||||
}
|
||||
// Parse all the VObjects
|
||||
foreach($objects as $object) {
|
||||
$vobject = OC_VObject::parse($object[1]);
|
||||
if(!is_null($vobject)) {
|
||||
// Load the categories
|
||||
$this->loadFromVObject($object[0], $vobject, $sync);
|
||||
} else {
|
||||
OC_Log::write('core', __METHOD__ . ', unable to parse. ID: ' . ', '
|
||||
. substr($object, 0, 100) . '(...)', OC_Log::DEBUG);
|
||||
}
|
||||
}
|
||||
$this->save();
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Save the list with categories
|
||||
*/
|
||||
private function save() {
|
||||
if(is_array($this->categories)) {
|
||||
foreach($this->categories as $category) {
|
||||
try {
|
||||
OCP\DB::insertIfNotExist(self::CATEGORY_TABLE,
|
||||
array(
|
||||
'uid' => $this->user,
|
||||
'type' => $this->type,
|
||||
'category' => $category,
|
||||
));
|
||||
} catch(Exception $e) {
|
||||
OCP\Util::writeLog('core', __METHOD__.', exception: '.$e->getMessage(),
|
||||
OCP\Util::ERROR);
|
||||
}
|
||||
}
|
||||
// reload categories to get the proper ids.
|
||||
$this->loadCategories();
|
||||
// Loop through temporarily cached objectid/categoryname pairs
|
||||
// and save relations.
|
||||
$categories = $this->categories;
|
||||
// For some reason this is needed or array_search(i) will return 0..?
|
||||
ksort($categories);
|
||||
foreach(self::$relations as $relation) {
|
||||
$catid = $this->array_searchi($relation['category'], $categories);
|
||||
OC_Log::write('core', __METHOD__ . 'catid, ' . $relation['category'] . ' ' . $catid, OC_Log::DEBUG);
|
||||
if($catid) {
|
||||
try {
|
||||
OCP\DB::insertIfNotExist(self::RELATION_TABLE,
|
||||
array(
|
||||
'objid' => $relation['objid'],
|
||||
'categoryid' => $catid,
|
||||
'type' => $this->type,
|
||||
));
|
||||
} catch(Exception $e) {
|
||||
OCP\Util::writeLog('core', __METHOD__.', exception: '.$e->getMessage(),
|
||||
OCP\Util::ERROR);
|
||||
}
|
||||
}
|
||||
}
|
||||
self::$relations = array(); // reset
|
||||
} else {
|
||||
OC_Log::write('core', __METHOD__.', $this->categories is not an array! '
|
||||
. print_r($this->categories, true), OC_Log::ERROR);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Delete categories and category/object relations for a user.
|
||||
* For hooking up on post_deleteUser
|
||||
* @param string $uid The user id for which entries should be purged.
|
||||
*/
|
||||
public static function post_deleteUser($arguments) {
|
||||
// Find all objectid/categoryid pairs.
|
||||
$result = null;
|
||||
try {
|
||||
$stmt = OCP\DB::prepare('SELECT `id` FROM `' . self::CATEGORY_TABLE . '` '
|
||||
. 'WHERE `uid` = ?');
|
||||
$result = $stmt->execute(array($arguments['uid']));
|
||||
if (OC_DB::isError($result)) {
|
||||
OC_Log::write('core', __METHOD__. 'DB error: ' . OC_DB::getErrorMessage($result), OC_Log::ERROR);
|
||||
}
|
||||
} catch(Exception $e) {
|
||||
OCP\Util::writeLog('core', __METHOD__.', exception: '.$e->getMessage(),
|
||||
OCP\Util::ERROR);
|
||||
}
|
||||
|
||||
if(!is_null($result)) {
|
||||
try {
|
||||
$stmt = OCP\DB::prepare('DELETE FROM `' . self::RELATION_TABLE . '` '
|
||||
. 'WHERE `categoryid` = ?');
|
||||
while( $row = $result->fetchRow()) {
|
||||
try {
|
||||
$stmt->execute(array($row['id']));
|
||||
} catch(Exception $e) {
|
||||
OCP\Util::writeLog('core', __METHOD__.', exception: '.$e->getMessage(),
|
||||
OCP\Util::ERROR);
|
||||
}
|
||||
}
|
||||
} catch(Exception $e) {
|
||||
OCP\Util::writeLog('core', __METHOD__.', exception: '.$e->getMessage(),
|
||||
OCP\Util::ERROR);
|
||||
}
|
||||
}
|
||||
try {
|
||||
$stmt = OCP\DB::prepare('DELETE FROM `' . self::CATEGORY_TABLE . '` '
|
||||
. 'WHERE `uid` = ?');
|
||||
$result = $stmt->execute(array($arguments['uid']));
|
||||
if (OC_DB::isError($result)) {
|
||||
OC_Log::write('core', __METHOD__. 'DB error: ' . OC_DB::getErrorMessage($result), OC_Log::ERROR);
|
||||
}
|
||||
} catch(Exception $e) {
|
||||
OCP\Util::writeLog('core', __METHOD__ . ', exception: '
|
||||
. $e->getMessage(), OCP\Util::ERROR);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Delete category/object relations from the db
|
||||
* @param array $ids The ids of the objects
|
||||
* @param string $type The type of object (event/contact/task/journal).
|
||||
* Defaults to the type set in the instance
|
||||
* @returns boolean Returns false on error.
|
||||
*/
|
||||
public function purgeObjects(array $ids, $type = null) {
|
||||
$type = is_null($type) ? $this->type : $type;
|
||||
if(count($ids) === 0) {
|
||||
// job done ;)
|
||||
return true;
|
||||
}
|
||||
$updates = $ids;
|
||||
try {
|
||||
$query = 'DELETE FROM `' . self::RELATION_TABLE . '` ';
|
||||
$query .= 'WHERE `objid` IN (' . str_repeat('?,', count($ids)-1) . '?) ';
|
||||
$query .= 'AND `type`= ?';
|
||||
$updates[] = $type;
|
||||
$stmt = OCP\DB::prepare($query);
|
||||
$result = $stmt->execute($updates);
|
||||
if (OC_DB::isError($result)) {
|
||||
OC_Log::write('core', __METHOD__. 'DB error: ' . OC_DB::getErrorMessage($result), OC_Log::ERROR);
|
||||
return false;
|
||||
}
|
||||
} catch(Exception $e) {
|
||||
OCP\Util::writeLog('core', __METHOD__.', exception: ' . $e->getMessage(),
|
||||
OCP\Util::ERROR);
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get favorites for an object type
|
||||
*
|
||||
* @param string $type The type of object (event/contact/task/journal).
|
||||
* Defaults to the type set in the instance
|
||||
* @returns array An array of object ids.
|
||||
*/
|
||||
public function getFavorites($type = null) {
|
||||
$type = is_null($type) ? $this->type : $type;
|
||||
|
||||
try {
|
||||
return $this->idsForCategory(self::CATEGORY_FAVORITE);
|
||||
} catch(Exception $e) {
|
||||
// No favorites
|
||||
return array();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Add an object to favorites
|
||||
*
|
||||
* @param int $objid The id of the object
|
||||
* @param string $type The type of object (event/contact/task/journal).
|
||||
* Defaults to the type set in the instance
|
||||
* @returns boolean
|
||||
*/
|
||||
public function addToFavorites($objid, $type = null) {
|
||||
$type = is_null($type) ? $this->type : $type;
|
||||
if(!$this->hasCategory(self::CATEGORY_FAVORITE)) {
|
||||
$this->add(self::CATEGORY_FAVORITE, true);
|
||||
}
|
||||
return $this->addToCategory($objid, self::CATEGORY_FAVORITE, $type);
|
||||
}
|
||||
|
||||
/**
|
||||
* Remove an object from favorites
|
||||
*
|
||||
* @param int $objid The id of the object
|
||||
* @param string $type The type of object (event/contact/task/journal).
|
||||
* Defaults to the type set in the instance
|
||||
* @returns boolean
|
||||
*/
|
||||
public function removeFromFavorites($objid, $type = null) {
|
||||
$type = is_null($type) ? $this->type : $type;
|
||||
return $this->removeFromCategory($objid, self::CATEGORY_FAVORITE, $type);
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Creates a category/object relation.
|
||||
* @param int $objid The id of the object
|
||||
* @param int|string $category The id or name of the category
|
||||
* @param string $type The type of object (event/contact/task/journal).
|
||||
* Defaults to the type set in the instance
|
||||
* @returns boolean Returns false on database error.
|
||||
*/
|
||||
public function addToCategory($objid, $category, $type = null) {
|
||||
$type = is_null($type) ? $this->type : $type;
|
||||
if(is_string($category) && !is_numeric($category)) {
|
||||
if(!$this->hasCategory($category)) {
|
||||
$this->add($category, true);
|
||||
}
|
||||
$categoryid = $this->array_searchi($category, $this->categories);
|
||||
} else {
|
||||
$categoryid = $category;
|
||||
}
|
||||
try {
|
||||
OCP\DB::insertIfNotExist(self::RELATION_TABLE,
|
||||
array(
|
||||
'objid' => $objid,
|
||||
'categoryid' => $categoryid,
|
||||
'type' => $type,
|
||||
));
|
||||
} catch(Exception $e) {
|
||||
OCP\Util::writeLog('core', __METHOD__.', exception: '.$e->getMessage(),
|
||||
OCP\Util::ERROR);
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Delete single category/object relation from the db
|
||||
* @param int $objid The id of the object
|
||||
* @param int|string $category The id or name of the category
|
||||
* @param string $type The type of object (event/contact/task/journal).
|
||||
* Defaults to the type set in the instance
|
||||
* @returns boolean
|
||||
*/
|
||||
public function removeFromCategory($objid, $category, $type = null) {
|
||||
$type = is_null($type) ? $this->type : $type;
|
||||
$categoryid = (is_string($category) && !is_numeric($category))
|
||||
? $this->array_searchi($category, $this->categories)
|
||||
: $category;
|
||||
try {
|
||||
$sql = 'DELETE FROM `' . self::RELATION_TABLE . '` '
|
||||
. 'WHERE `objid` = ? AND `categoryid` = ? AND `type` = ?';
|
||||
OCP\Util::writeLog('core', __METHOD__.', sql: ' . $objid . ' ' . $categoryid . ' ' . $type,
|
||||
OCP\Util::DEBUG);
|
||||
$stmt = OCP\DB::prepare($sql);
|
||||
$stmt->execute(array($objid, $categoryid, $type));
|
||||
} catch(Exception $e) {
|
||||
OCP\Util::writeLog('core', __METHOD__.', exception: '.$e->getMessage(),
|
||||
OCP\Util::ERROR);
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Delete categories from the db and from all the vobject supplied
|
||||
* @param $names An array of categories to delete
|
||||
* @param $objects An array of arrays with [id,vobject] (as text) pairs suitable for updating the apps object table.
|
||||
*/
|
||||
public function delete($names, array &$objects=null) {
|
||||
if(!is_array($names)) {
|
||||
$names = array($names);
|
||||
}
|
||||
|
||||
OC_Log::write('core', __METHOD__ . ', before: '
|
||||
. print_r($this->categories, true), OC_Log::DEBUG);
|
||||
foreach($names as $name) {
|
||||
$id = null;
|
||||
OC_Log::write('core', __METHOD__.', '.$name, OC_Log::DEBUG);
|
||||
if($this->hasCategory($name)) {
|
||||
$id = $this->array_searchi($name, $this->categories);
|
||||
unset($this->categories[$id]);
|
||||
}
|
||||
try {
|
||||
$stmt = OCP\DB::prepare('DELETE FROM `' . self::CATEGORY_TABLE . '` WHERE '
|
||||
. '`uid` = ? AND `type` = ? AND `category` = ?');
|
||||
$result = $stmt->execute(array($this->user, $this->type, $name));
|
||||
if (OC_DB::isError($result)) {
|
||||
OC_Log::write('core', __METHOD__. 'DB error: ' . OC_DB::getErrorMessage($result), OC_Log::ERROR);
|
||||
}
|
||||
} catch(Exception $e) {
|
||||
OCP\Util::writeLog('core', __METHOD__ . ', exception: '
|
||||
. $e->getMessage(), OCP\Util::ERROR);
|
||||
}
|
||||
if(!is_null($id) && $id !== false) {
|
||||
try {
|
||||
$sql = 'DELETE FROM `' . self::RELATION_TABLE . '` '
|
||||
. 'WHERE `categoryid` = ?';
|
||||
$stmt = OCP\DB::prepare($sql);
|
||||
$result = $stmt->execute(array($id));
|
||||
if (OC_DB::isError($result)) {
|
||||
OC_Log::write('core',
|
||||
__METHOD__. 'DB error: ' . OC_DB::getErrorMessage($result),
|
||||
OC_Log::ERROR);
|
||||
}
|
||||
} catch(Exception $e) {
|
||||
OCP\Util::writeLog('core', __METHOD__.', exception: '.$e->getMessage(),
|
||||
OCP\Util::ERROR);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
OC_Log::write('core', __METHOD__.', after: '
|
||||
. print_r($this->categories, true), OC_Log::DEBUG);
|
||||
if(!is_null($objects)) {
|
||||
foreach($objects as $key=>&$value) {
|
||||
$vobject = OC_VObject::parse($value[1]);
|
||||
if(!is_null($vobject)) {
|
||||
$object = null;
|
||||
$componentname = '';
|
||||
if (isset($vobject->VEVENT)) {
|
||||
$object = $vobject->VEVENT;
|
||||
$componentname = 'VEVENT';
|
||||
} else
|
||||
if (isset($vobject->VTODO)) {
|
||||
$object = $vobject->VTODO;
|
||||
$componentname = 'VTODO';
|
||||
} else
|
||||
if (isset($vobject->VJOURNAL)) {
|
||||
$object = $vobject->VJOURNAL;
|
||||
$componentname = 'VJOURNAL';
|
||||
} else {
|
||||
$object = $vobject;
|
||||
}
|
||||
$categories = $object->getAsArray('CATEGORIES');
|
||||
foreach($names as $name) {
|
||||
$idx = $this->array_searchi($name, $categories);
|
||||
if($idx !== false) {
|
||||
OC_Log::write('core', __METHOD__
|
||||
.', unsetting: '
|
||||
. $categories[$this->array_searchi($name, $categories)],
|
||||
OC_Log::DEBUG);
|
||||
unset($categories[$this->array_searchi($name, $categories)]);
|
||||
}
|
||||
}
|
||||
|
||||
$object->setString('CATEGORIES', implode(',', $categories));
|
||||
if($vobject !== $object) {
|
||||
$vobject[$componentname] = $object;
|
||||
}
|
||||
$value[1] = $vobject->serialize();
|
||||
$objects[$key] = $value;
|
||||
} else {
|
||||
OC_Log::write('core', __METHOD__
|
||||
.', unable to parse. ID: ' . $value[0] . ', '
|
||||
. substr($value[1], 0, 50) . '(...)', OC_Log::DEBUG);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// case-insensitive in_array
|
||||
private function in_arrayi($needle, $haystack) {
|
||||
if(!is_array($haystack)) {
|
||||
return false;
|
||||
}
|
||||
return in_array(strtolower($needle), array_map('strtolower', $haystack));
|
||||
}
|
||||
|
||||
// case-insensitive array_search
|
||||
private function array_searchi($needle, $haystack) {
|
||||
if(!is_array($haystack)) {
|
||||
return false;
|
||||
}
|
||||
return array_search(strtolower($needle), array_map('strtolower', $haystack));
|
||||
}
|
||||
}
|
|
@ -0,0 +1,99 @@
|
|||
<?php
|
||||
|
||||
/**
|
||||
* ownCloud - App Framework
|
||||
*
|
||||
* @author Bernhard Posselt
|
||||
* @copyright 2012 Bernhard Posselt nukeawhale@gmail.com
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 3 of the License, or any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU AFFERO GENERAL PUBLIC LICENSE for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public
|
||||
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
*/
|
||||
|
||||
|
||||
namespace OC\AppFramework;
|
||||
|
||||
|
||||
class AppTest extends \PHPUnit_Framework_TestCase {
|
||||
|
||||
private $container;
|
||||
private $api;
|
||||
private $controller;
|
||||
private $dispatcher;
|
||||
private $params;
|
||||
private $headers;
|
||||
private $output;
|
||||
private $controllerName;
|
||||
private $controllerMethod;
|
||||
|
||||
protected function setUp() {
|
||||
$this->container = new \OC\AppFramework\DependencyInjection\DIContainer('test');
|
||||
$this->controller = $this->getMockBuilder(
|
||||
'OC\AppFramework\Controller\Controller')
|
||||
->disableOriginalConstructor()
|
||||
->getMock();
|
||||
$this->dispatcher = $this->getMockBuilder(
|
||||
'OC\AppFramework\Http\Dispatcher')
|
||||
->disableOriginalConstructor()
|
||||
->getMock();
|
||||
|
||||
|
||||
$this->headers = array('key' => 'value');
|
||||
$this->output = 'hi';
|
||||
$this->controllerName = 'Controller';
|
||||
$this->controllerMethod = 'method';
|
||||
|
||||
$this->container[$this->controllerName] = $this->controller;
|
||||
$this->container['Dispatcher'] = $this->dispatcher;
|
||||
}
|
||||
|
||||
|
||||
public function testControllerNameAndMethodAreBeingPassed(){
|
||||
$return = array(null, array(), null);
|
||||
$this->dispatcher->expects($this->once())
|
||||
->method('dispatch')
|
||||
->with($this->equalTo($this->controller),
|
||||
$this->equalTo($this->controllerMethod))
|
||||
->will($this->returnValue($return));
|
||||
|
||||
$this->expectOutputString('');
|
||||
|
||||
App::main($this->controllerName, $this->controllerMethod, array(),
|
||||
$this->container);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
FIXME: this complains about shit headers which are already sent because
|
||||
of the content length. Would be cool if someone could fix this
|
||||
|
||||
public function testOutputIsPrinted(){
|
||||
$return = array(null, array(), $this->output);
|
||||
$this->dispatcher->expects($this->once())
|
||||
->method('dispatch')
|
||||
->with($this->equalTo($this->controller),
|
||||
$this->equalTo($this->controllerMethod))
|
||||
->will($this->returnValue($return));
|
||||
|
||||
$this->expectOutputString($this->output);
|
||||
|
||||
App::main($this->controllerName, $this->controllerMethod, array(),
|
||||
$this->container);
|
||||
}
|
||||
*/
|
||||
|
||||
// FIXME: if someone manages to test the headers output, I'd be grateful
|
||||
|
||||
|
||||
}
|
|
@ -0,0 +1,155 @@
|
|||
<?php
|
||||
|
||||
/**
|
||||
* ownCloud - App Framework
|
||||
*
|
||||
* @author Bernhard Posselt
|
||||
* @copyright 2012 Bernhard Posselt nukeawhale@gmail.com
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 3 of the License, or any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU AFFERO GENERAL PUBLIC LICENSE for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public
|
||||
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
*/
|
||||
|
||||
|
||||
namespace Test\AppFramework\Controller;
|
||||
|
||||
use OC\AppFramework\Http\Request;
|
||||
use OC\AppFramework\Controller\Controller;
|
||||
use OCP\AppFramework\Http\TemplateResponse;
|
||||
|
||||
|
||||
//require_once __DIR__ . "/../classloader.php";
|
||||
|
||||
|
||||
class ChildController extends Controller {};
|
||||
|
||||
class ControllerTest extends \PHPUnit_Framework_TestCase {
|
||||
|
||||
/**
|
||||
* @var Controller
|
||||
*/
|
||||
private $controller;
|
||||
private $api;
|
||||
|
||||
protected function setUp(){
|
||||
$request = new Request(
|
||||
array(
|
||||
'get' => array('name' => 'John Q. Public', 'nickname' => 'Joey'),
|
||||
'post' => array('name' => 'Jane Doe', 'nickname' => 'Janey'),
|
||||
'urlParams' => array('name' => 'Johnny Weissmüller'),
|
||||
'files' => array('file' => 'filevalue'),
|
||||
'env' => array('PATH' => 'daheim'),
|
||||
'session' => array('sezession' => 'kein'),
|
||||
'method' => 'hi',
|
||||
)
|
||||
);
|
||||
|
||||
$this->api = $this->getMock('OC\AppFramework\Core\API',
|
||||
array('getAppName'), array('test'));
|
||||
$this->api->expects($this->any())
|
||||
->method('getAppName')
|
||||
->will($this->returnValue('apptemplate_advanced'));
|
||||
|
||||
$this->controller = new ChildController($this->api, $request);
|
||||
}
|
||||
|
||||
|
||||
public function testParamsGet(){
|
||||
$this->assertEquals('Johnny Weissmüller', $this->controller->params('name', 'Tarzan'));
|
||||
}
|
||||
|
||||
|
||||
public function testParamsGetDefault(){
|
||||
$this->assertEquals('Tarzan', $this->controller->params('Ape Man', 'Tarzan'));
|
||||
}
|
||||
|
||||
|
||||
public function testParamsFile(){
|
||||
$this->assertEquals('filevalue', $this->controller->params('file', 'filevalue'));
|
||||
}
|
||||
|
||||
|
||||
public function testGetUploadedFile(){
|
||||
$this->assertEquals('filevalue', $this->controller->getUploadedFile('file'));
|
||||
}
|
||||
|
||||
|
||||
|
||||
public function testGetUploadedFileDefault(){
|
||||
$this->assertEquals('default', $this->controller->params('files', 'default'));
|
||||
}
|
||||
|
||||
|
||||
public function testGetParams(){
|
||||
$params = array(
|
||||
'name' => 'Johnny Weissmüller',
|
||||
'nickname' => 'Janey',
|
||||
);
|
||||
|
||||
$this->assertEquals($params, $this->controller->getParams());
|
||||
}
|
||||
|
||||
|
||||
public function testRender(){
|
||||
$this->assertTrue($this->controller->render('') instanceof TemplateResponse);
|
||||
}
|
||||
|
||||
|
||||
public function testSetParams(){
|
||||
$params = array('john' => 'foo');
|
||||
$response = $this->controller->render('home', $params);
|
||||
|
||||
$this->assertEquals($params, $response->getParams());
|
||||
}
|
||||
|
||||
|
||||
public function testRenderRenderAs(){
|
||||
$ocTpl = $this->getMock('Template', array('fetchPage'));
|
||||
$ocTpl->expects($this->once())
|
||||
->method('fetchPage');
|
||||
|
||||
$api = $this->getMock('OC\AppFramework\Core\API',
|
||||
array('getAppName', 'getTemplate'), array('app'));
|
||||
$api->expects($this->any())
|
||||
->method('getAppName')
|
||||
->will($this->returnValue('app'));
|
||||
$api->expects($this->once())
|
||||
->method('getTemplate')
|
||||
->with($this->equalTo('home'), $this->equalTo('admin'), $this->equalTo('app'))
|
||||
->will($this->returnValue($ocTpl));
|
||||
|
||||
$this->controller = new ChildController($api, new Request());
|
||||
$this->controller->render('home', array(), 'admin')->render();
|
||||
}
|
||||
|
||||
|
||||
public function testRenderHeaders(){
|
||||
$headers = array('one', 'two');
|
||||
$response = $this->controller->render('', array(), '', $headers);
|
||||
|
||||
$this->assertTrue(in_array($headers[0], $response->getHeaders()));
|
||||
$this->assertTrue(in_array($headers[1], $response->getHeaders()));
|
||||
}
|
||||
|
||||
|
||||
public function testGetRequestMethod(){
|
||||
$this->assertEquals('hi', $this->controller->method());
|
||||
}
|
||||
|
||||
|
||||
public function testGetEnvVariable(){
|
||||
$this->assertEquals('daheim', $this->controller->env('PATH'));
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,98 @@
|
|||
<?php
|
||||
|
||||
/**
|
||||
* ownCloud - App Framework
|
||||
*
|
||||
* @author Bernhard Posselt
|
||||
* @author Morris Jobke
|
||||
* @copyright 2012 Bernhard Posselt nukeawhale@gmail.com
|
||||
* @copyright 2013 Morris Jobke morris.jobke@gmail.com
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 3 of the License, or any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU AFFERO GENERAL PUBLIC LICENSE for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public
|
||||
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
*/
|
||||
|
||||
|
||||
namespace OC\AppFramework\DependencyInjection;
|
||||
|
||||
use \OC\AppFramework\Http\Request;
|
||||
|
||||
|
||||
//require_once(__DIR__ . "/../classloader.php");
|
||||
|
||||
|
||||
class DIContainerTest extends \PHPUnit_Framework_TestCase {
|
||||
|
||||
private $container;
|
||||
|
||||
protected function setUp(){
|
||||
$this->container = new DIContainer('name');
|
||||
$this->api = $this->getMock('OC\AppFramework\Core\API', array('getTrans'), array('hi'));
|
||||
}
|
||||
|
||||
private function exchangeAPI(){
|
||||
$this->api->expects($this->any())
|
||||
->method('getTrans')
|
||||
->will($this->returnValue('yo'));
|
||||
$this->container['API'] = $this->api;
|
||||
}
|
||||
|
||||
public function testProvidesAPI(){
|
||||
$this->assertTrue(isset($this->container['API']));
|
||||
}
|
||||
|
||||
|
||||
public function testProvidesRequest(){
|
||||
$this->assertTrue(isset($this->container['Request']));
|
||||
}
|
||||
|
||||
|
||||
public function testProvidesSecurityMiddleware(){
|
||||
$this->assertTrue(isset($this->container['SecurityMiddleware']));
|
||||
}
|
||||
|
||||
|
||||
public function testProvidesMiddlewareDispatcher(){
|
||||
$this->assertTrue(isset($this->container['MiddlewareDispatcher']));
|
||||
}
|
||||
|
||||
|
||||
public function testProvidesAppName(){
|
||||
$this->assertTrue(isset($this->container['AppName']));
|
||||
}
|
||||
|
||||
|
||||
public function testAppNameIsSetCorrectly(){
|
||||
$this->assertEquals('name', $this->container['AppName']);
|
||||
}
|
||||
|
||||
|
||||
public function testMiddlewareDispatcherIncludesSecurityMiddleware(){
|
||||
$this->container['Request'] = new Request();
|
||||
$security = $this->container['SecurityMiddleware'];
|
||||
$dispatcher = $this->container['MiddlewareDispatcher'];
|
||||
|
||||
$this->assertContains($security, $dispatcher->getMiddlewares());
|
||||
}
|
||||
|
||||
|
||||
public function testMiddlewareDispatcherDoesNotIncludeTwigWhenTplDirectoryNotSet(){
|
||||
$this->container['Request'] = new Request();
|
||||
$this->exchangeAPI();
|
||||
$dispatcher = $this->container['MiddlewareDispatcher'];
|
||||
|
||||
$this->assertEquals(1, count($dispatcher->getMiddlewares()));
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,218 @@
|
|||
<?php
|
||||
|
||||
/**
|
||||
* ownCloud - App Framework
|
||||
*
|
||||
* @author Bernhard Posselt
|
||||
* @copyright 2012 Bernhard Posselt nukeawhale@gmail.com
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 3 of the License, or any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU AFFERO GENERAL PUBLIC LICENSE for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public
|
||||
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
*/
|
||||
|
||||
|
||||
namespace OC\AppFramework\Http;
|
||||
|
||||
use OC\AppFramework\Core\API;
|
||||
use OC\AppFramework\Middleware\MiddlewareDispatcher;
|
||||
|
||||
//require_once(__DIR__ . "/../classloader.php");
|
||||
|
||||
|
||||
class DispatcherTest extends \PHPUnit_Framework_TestCase {
|
||||
|
||||
|
||||
private $middlewareDispatcher;
|
||||
private $dispatcher;
|
||||
private $controllerMethod;
|
||||
private $response;
|
||||
private $lastModified;
|
||||
private $etag;
|
||||
private $http;
|
||||
|
||||
protected function setUp() {
|
||||
$this->controllerMethod = 'test';
|
||||
|
||||
$api = $this->getMockBuilder(
|
||||
'\OC\AppFramework\Core\API')
|
||||
->disableOriginalConstructor()
|
||||
->getMock();
|
||||
$request = $this->getMockBuilder(
|
||||
'\OC\AppFramework\Http\Request')
|
||||
->disableOriginalConstructor()
|
||||
->getMock();
|
||||
$this->http = $this->getMockBuilder(
|
||||
'\OC\AppFramework\Http\Http')
|
||||
->disableOriginalConstructor()
|
||||
->getMock();
|
||||
|
||||
$this->middlewareDispatcher = $this->getMockBuilder(
|
||||
'\OC\AppFramework\Middleware\MiddlewareDispatcher')
|
||||
->disableOriginalConstructor()
|
||||
->getMock();
|
||||
$this->controller = $this->getMock(
|
||||
'\OC\AppFramework\Controller\Controller',
|
||||
array($this->controllerMethod), array($api, $request));
|
||||
|
||||
$this->dispatcher = new Dispatcher(
|
||||
$this->http, $this->middlewareDispatcher);
|
||||
|
||||
$this->response = $this->getMockBuilder(
|
||||
'\OCP\AppFramework\Http\Response')
|
||||
->disableOriginalConstructor()
|
||||
->getMock();
|
||||
|
||||
$this->lastModified = new \DateTime(null, new \DateTimeZone('GMT'));
|
||||
$this->etag = 'hi';
|
||||
}
|
||||
|
||||
|
||||
private function setMiddlewareExpections($out=null,
|
||||
$httpHeaders=null, $responseHeaders=array(),
|
||||
$ex=false, $catchEx=true) {
|
||||
|
||||
if($ex) {
|
||||
$exception = new \Exception();
|
||||
$this->middlewareDispatcher->expects($this->once())
|
||||
->method('beforeController')
|
||||
->with($this->equalTo($this->controller),
|
||||
$this->equalTo($this->controllerMethod))
|
||||
->will($this->throwException($exception));
|
||||
if($catchEx) {
|
||||
$this->middlewareDispatcher->expects($this->once())
|
||||
->method('afterException')
|
||||
->with($this->equalTo($this->controller),
|
||||
$this->equalTo($this->controllerMethod),
|
||||
$this->equalTo($exception))
|
||||
->will($this->returnValue($this->response));
|
||||
} else {
|
||||
$this->middlewareDispatcher->expects($this->once())
|
||||
->method('afterException')
|
||||
->with($this->equalTo($this->controller),
|
||||
$this->equalTo($this->controllerMethod),
|
||||
$this->equalTo($exception))
|
||||
->will($this->returnValue(null));
|
||||
return;
|
||||
}
|
||||
} else {
|
||||
$this->middlewareDispatcher->expects($this->once())
|
||||
->method('beforeController')
|
||||
->with($this->equalTo($this->controller),
|
||||
$this->equalTo($this->controllerMethod));
|
||||
$this->controller->expects($this->once())
|
||||
->method($this->controllerMethod)
|
||||
->will($this->returnValue($this->response));
|
||||
}
|
||||
|
||||
$this->response->expects($this->once())
|
||||
->method('render')
|
||||
->will($this->returnValue($out));
|
||||
$this->response->expects($this->once())
|
||||
->method('getStatus')
|
||||
->will($this->returnValue(Http::STATUS_OK));
|
||||
$this->response->expects($this->once())
|
||||
->method('getLastModified')
|
||||
->will($this->returnValue($this->lastModified));
|
||||
$this->response->expects($this->once())
|
||||
->method('getETag')
|
||||
->will($this->returnValue($this->etag));
|
||||
$this->response->expects($this->once())
|
||||
->method('getHeaders')
|
||||
->will($this->returnValue($responseHeaders));
|
||||
$this->http->expects($this->once())
|
||||
->method('getStatusHeader')
|
||||
->with($this->equalTo(Http::STATUS_OK),
|
||||
$this->equalTo($this->lastModified),
|
||||
$this->equalTo($this->etag))
|
||||
->will($this->returnValue($httpHeaders));
|
||||
|
||||
$this->middlewareDispatcher->expects($this->once())
|
||||
->method('afterController')
|
||||
->with($this->equalTo($this->controller),
|
||||
$this->equalTo($this->controllerMethod),
|
||||
$this->equalTo($this->response))
|
||||
->will($this->returnValue($this->response));
|
||||
|
||||
$this->middlewareDispatcher->expects($this->once())
|
||||
->method('afterController')
|
||||
->with($this->equalTo($this->controller),
|
||||
$this->equalTo($this->controllerMethod),
|
||||
$this->equalTo($this->response))
|
||||
->will($this->returnValue($this->response));
|
||||
|
||||
$this->middlewareDispatcher->expects($this->once())
|
||||
->method('beforeOutput')
|
||||
->with($this->equalTo($this->controller),
|
||||
$this->equalTo($this->controllerMethod),
|
||||
$this->equalTo($out))
|
||||
->will($this->returnValue($out));
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
public function testDispatcherReturnsArrayWith2Entries() {
|
||||
$this->setMiddlewareExpections();
|
||||
|
||||
$response = $this->dispatcher->dispatch($this->controller,
|
||||
$this->controllerMethod);
|
||||
$this->assertNull($response[0]);
|
||||
$this->assertEquals(array(), $response[1]);
|
||||
$this->assertNull($response[2]);
|
||||
}
|
||||
|
||||
|
||||
public function testHeadersAndOutputAreReturned(){
|
||||
$out = 'yo';
|
||||
$httpHeaders = 'Http';
|
||||
$responseHeaders = array('hell' => 'yeah');
|
||||
$this->setMiddlewareExpections($out, $httpHeaders, $responseHeaders);
|
||||
|
||||
$response = $this->dispatcher->dispatch($this->controller,
|
||||
$this->controllerMethod);
|
||||
|
||||
$this->assertEquals($httpHeaders, $response[0]);
|
||||
$this->assertEquals($responseHeaders, $response[1]);
|
||||
$this->assertEquals($out, $response[2]);
|
||||
}
|
||||
|
||||
|
||||
public function testExceptionCallsAfterException() {
|
||||
$out = 'yo';
|
||||
$httpHeaders = 'Http';
|
||||
$responseHeaders = array('hell' => 'yeah');
|
||||
$this->setMiddlewareExpections($out, $httpHeaders, $responseHeaders, true);
|
||||
|
||||
$response = $this->dispatcher->dispatch($this->controller,
|
||||
$this->controllerMethod);
|
||||
|
||||
$this->assertEquals($httpHeaders, $response[0]);
|
||||
$this->assertEquals($responseHeaders, $response[1]);
|
||||
$this->assertEquals($out, $response[2]);
|
||||
}
|
||||
|
||||
|
||||
public function testExceptionThrowsIfCanNotBeHandledByAfterException() {
|
||||
$out = 'yo';
|
||||
$httpHeaders = 'Http';
|
||||
$responseHeaders = array('hell' => 'yeah');
|
||||
$this->setMiddlewareExpections($out, $httpHeaders, $responseHeaders, true, false);
|
||||
|
||||
$this->setExpectedException('\Exception');
|
||||
$response = $this->dispatcher->dispatch($this->controller,
|
||||
$this->controllerMethod);
|
||||
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,51 @@
|
|||
<?php
|
||||
|
||||
/**
|
||||
* ownCloud - App Framework
|
||||
*
|
||||
* @author Bernhard Posselt
|
||||
* @copyright 2012 Bernhard Posselt nukeawhale@gmail.com
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 3 of the License, or any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU AFFERO GENERAL PUBLIC LICENSE for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public
|
||||
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
*/
|
||||
|
||||
|
||||
namespace OC\AppFramework\Http;
|
||||
|
||||
|
||||
//require_once(__DIR__ . "/../classloader.php");
|
||||
|
||||
|
||||
class ChildDownloadResponse extends DownloadResponse {};
|
||||
|
||||
|
||||
class DownloadResponseTest extends \PHPUnit_Framework_TestCase {
|
||||
|
||||
protected $response;
|
||||
|
||||
protected function setUp(){
|
||||
$this->response = new ChildDownloadResponse('file', 'content');
|
||||
}
|
||||
|
||||
|
||||
public function testHeaders() {
|
||||
$headers = $this->response->getHeaders();
|
||||
|
||||
$this->assertContains('attachment; filename="file"', $headers['Content-Disposition']);
|
||||
$this->assertContains('content', $headers['Content-Type']);
|
||||
}
|
||||
|
||||
|
||||
}
|
|
@ -0,0 +1,87 @@
|
|||
<?php
|
||||
|
||||
/**
|
||||
* ownCloud - App Framework
|
||||
*
|
||||
* @author Bernhard Posselt
|
||||
* @copyright 2012 Bernhard Posselt nukeawhale@gmail.com
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 3 of the License, or any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU AFFERO GENERAL PUBLIC LICENSE for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public
|
||||
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
*/
|
||||
|
||||
|
||||
namespace OC\AppFramework\Http;
|
||||
|
||||
|
||||
//require_once(__DIR__ . "/../classloader.php");
|
||||
|
||||
|
||||
|
||||
class HttpTest extends \PHPUnit_Framework_TestCase {
|
||||
|
||||
private $server;
|
||||
private $http;
|
||||
|
||||
protected function setUp(){
|
||||
$this->server = array();
|
||||
$this->http = new Http($this->server);
|
||||
}
|
||||
|
||||
|
||||
public function testProtocol() {
|
||||
$header = $this->http->getStatusHeader(Http::STATUS_TEMPORARY_REDIRECT);
|
||||
$this->assertEquals('HTTP/1.1 307 Temporary Redirect', $header);
|
||||
}
|
||||
|
||||
|
||||
public function testProtocol10() {
|
||||
$this->http = new Http($this->server, 'HTTP/1.0');
|
||||
$header = $this->http->getStatusHeader(Http::STATUS_OK);
|
||||
$this->assertEquals('HTTP/1.0 200 OK', $header);
|
||||
}
|
||||
|
||||
|
||||
public function testEtagMatchReturnsNotModified() {
|
||||
$http = new Http(array('HTTP_IF_NONE_MATCH' => 'hi'));
|
||||
|
||||
$header = $http->getStatusHeader(Http::STATUS_OK, null, 'hi');
|
||||
$this->assertEquals('HTTP/1.1 304 Not Modified', $header);
|
||||
}
|
||||
|
||||
|
||||
public function testLastModifiedMatchReturnsNotModified() {
|
||||
$dateTime = new \DateTime(null, new \DateTimeZone('GMT'));
|
||||
$dateTime->setTimestamp('12');
|
||||
|
||||
$http = new Http(
|
||||
array(
|
||||
'HTTP_IF_MODIFIED_SINCE' => 'Thu, 01 Jan 1970 00:00:12 +0000')
|
||||
);
|
||||
|
||||
$header = $http->getStatusHeader(Http::STATUS_OK, $dateTime);
|
||||
$this->assertEquals('HTTP/1.1 304 Not Modified', $header);
|
||||
}
|
||||
|
||||
|
||||
|
||||
public function testTempRedirectBecomesFoundInHttp10() {
|
||||
$http = new Http(array(), 'HTTP/1.0');
|
||||
|
||||
$header = $http->getStatusHeader(Http::STATUS_TEMPORARY_REDIRECT);
|
||||
$this->assertEquals('HTTP/1.0 302 Found', $header);
|
||||
}
|
||||
// TODO: write unittests for http codes
|
||||
|
||||
}
|
|
@ -0,0 +1,98 @@
|
|||
<?php
|
||||
|
||||
/**
|
||||
* ownCloud - App Framework
|
||||
*
|
||||
* @author Bernhard Posselt
|
||||
* @author Morris Jobke
|
||||
* @copyright 2012 Bernhard Posselt nukeawhale@gmail.com
|
||||
* @copyright 2013 Morris Jobke morris.jobke@gmail.com
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 3 of the License, or any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU AFFERO GENERAL PUBLIC LICENSE for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public
|
||||
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
*/
|
||||
|
||||
|
||||
namespace OC\AppFramework\Http;
|
||||
|
||||
|
||||
use OCP\AppFramework\Http\JSONResponse;
|
||||
|
||||
//require_once(__DIR__ . "/../classloader.php");
|
||||
|
||||
|
||||
|
||||
class JSONResponseTest extends \PHPUnit_Framework_TestCase {
|
||||
|
||||
/**
|
||||
* @var JSONResponse
|
||||
*/
|
||||
private $json;
|
||||
|
||||
protected function setUp() {
|
||||
$this->json = new JSONResponse();
|
||||
}
|
||||
|
||||
|
||||
public function testHeader() {
|
||||
$headers = $this->json->getHeaders();
|
||||
$this->assertEquals('application/json; charset=utf-8', $headers['Content-type']);
|
||||
}
|
||||
|
||||
|
||||
public function testSetData() {
|
||||
$params = array('hi', 'yo');
|
||||
$this->json->setData($params);
|
||||
|
||||
$this->assertEquals(array('hi', 'yo'), $this->json->getData());
|
||||
}
|
||||
|
||||
|
||||
public function testSetRender() {
|
||||
$params = array('test' => 'hi');
|
||||
$this->json->setData($params);
|
||||
|
||||
$expected = '{"test":"hi"}';
|
||||
|
||||
$this->assertEquals($expected, $this->json->render());
|
||||
}
|
||||
|
||||
|
||||
public function testRender() {
|
||||
$params = array('test' => 'hi');
|
||||
$this->json->setData($params);
|
||||
|
||||
$expected = '{"test":"hi"}';
|
||||
|
||||
$this->assertEquals($expected, $this->json->render());
|
||||
}
|
||||
|
||||
|
||||
public function testShouldHaveXContentHeaderByDefault() {
|
||||
$headers = $this->json->getHeaders();
|
||||
$this->assertEquals('nosniff', $headers['X-Content-Type-Options']);
|
||||
}
|
||||
|
||||
|
||||
public function testConstructorAllowsToSetData() {
|
||||
$data = array('hi');
|
||||
$code = 300;
|
||||
$response = new JSONResponse($data, $code);
|
||||
|
||||
$expected = '["hi"]';
|
||||
$this->assertEquals($expected, $response->render());
|
||||
$this->assertEquals($code, $response->getStatus());
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,55 @@
|
|||
<?php
|
||||
|
||||
/**
|
||||
* ownCloud - App Framework
|
||||
*
|
||||
* @author Bernhard Posselt
|
||||
* @copyright 2012 Bernhard Posselt nukeawhale@gmail.com
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 3 of the License, or any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU AFFERO GENERAL PUBLIC LICENSE for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public
|
||||
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
*/
|
||||
|
||||
|
||||
namespace OC\AppFramework\Http;
|
||||
|
||||
|
||||
//require_once(__DIR__ . "/../classloader.php");
|
||||
|
||||
|
||||
|
||||
class RedirectResponseTest extends \PHPUnit_Framework_TestCase {
|
||||
|
||||
|
||||
protected $response;
|
||||
|
||||
protected function setUp(){
|
||||
$this->response = new RedirectResponse('/url');
|
||||
}
|
||||
|
||||
|
||||
public function testHeaders() {
|
||||
$headers = $this->response->getHeaders();
|
||||
$this->assertEquals('/url', $headers['Location']);
|
||||
$this->assertEquals(Http::STATUS_TEMPORARY_REDIRECT,
|
||||
$this->response->getStatus());
|
||||
}
|
||||
|
||||
|
||||
public function testGetRedirectUrl(){
|
||||
$this->assertEquals('/url', $this->response->getRedirectUrl());
|
||||
}
|
||||
|
||||
|
||||
}
|
|
@ -0,0 +1,76 @@
|
|||
<?php
|
||||
/**
|
||||
* Copyright (c) 2013 Thomas Tanghus (thomas@tanghus.net)
|
||||
* This file is licensed under the Affero General Public License version 3 or
|
||||
* later.
|
||||
* See the COPYING-README file.
|
||||
*/
|
||||
|
||||
namespace OC\AppFramework\Http;
|
||||
|
||||
|
||||
class RequestTest extends \PHPUnit_Framework_TestCase {
|
||||
|
||||
public function testRequestAccessors() {
|
||||
$vars = array(
|
||||
'get' => array('name' => 'John Q. Public', 'nickname' => 'Joey'),
|
||||
);
|
||||
|
||||
$request = new Request($vars);
|
||||
|
||||
// Countable
|
||||
$this->assertEquals(2, count($request));
|
||||
// Array access
|
||||
$this->assertEquals('Joey', $request['nickname']);
|
||||
// "Magic" accessors
|
||||
$this->assertEquals('Joey', $request->{'nickname'});
|
||||
$this->assertTrue(isset($request['nickname']));
|
||||
$this->assertTrue(isset($request->{'nickname'}));
|
||||
$this->assertEquals(false, isset($request->{'flickname'}));
|
||||
// Only testing 'get', but same approach for post, files etc.
|
||||
$this->assertEquals('Joey', $request->get['nickname']);
|
||||
// Always returns null if variable not set.
|
||||
$this->assertEquals(null, $request->{'flickname'});
|
||||
}
|
||||
|
||||
// urlParams has precedence over POST which has precedence over GET
|
||||
public function testPrecedence() {
|
||||
$vars = array(
|
||||
'get' => array('name' => 'John Q. Public', 'nickname' => 'Joey'),
|
||||
'post' => array('name' => 'Jane Doe', 'nickname' => 'Janey'),
|
||||
'urlParams' => array('user' => 'jw', 'name' => 'Johnny Weissmüller'),
|
||||
);
|
||||
|
||||
$request = new Request($vars);
|
||||
|
||||
$this->assertEquals(3, count($request));
|
||||
$this->assertEquals('Janey', $request->{'nickname'});
|
||||
$this->assertEquals('Johnny Weissmüller', $request->{'name'});
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @expectedException RuntimeException
|
||||
*/
|
||||
public function testImmutableArrayAccess() {
|
||||
$vars = array(
|
||||
'get' => array('name' => 'John Q. Public', 'nickname' => 'Joey'),
|
||||
);
|
||||
|
||||
$request = new Request($vars);
|
||||
$request['nickname'] = 'Janey';
|
||||
}
|
||||
|
||||
/**
|
||||
* @expectedException RuntimeException
|
||||
*/
|
||||
public function testImmutableMagicAccess() {
|
||||
$vars = array(
|
||||
'get' => array('name' => 'John Q. Public', 'nickname' => 'Joey'),
|
||||
);
|
||||
|
||||
$request = new Request($vars);
|
||||
$request->{'nickname'} = 'Janey';
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,120 @@
|
|||
<?php
|
||||
|
||||
/**
|
||||
* ownCloud - App Framework
|
||||
*
|
||||
* @author Bernhard Posselt
|
||||
* @copyright 2012 Bernhard Posselt nukeawhale@gmail.com
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 3 of the License, or any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU AFFERO GENERAL PUBLIC LICENSE for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public
|
||||
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
*/
|
||||
|
||||
|
||||
namespace OC\AppFramework\Http;
|
||||
|
||||
|
||||
use OCP\AppFramework\Http\Response;
|
||||
|
||||
|
||||
class ResponseTest extends \PHPUnit_Framework_TestCase {
|
||||
|
||||
/**
|
||||
* @var \OCP\AppFramework\Http\Response
|
||||
*/
|
||||
private $childResponse;
|
||||
|
||||
protected function setUp(){
|
||||
$this->childResponse = new Response();
|
||||
}
|
||||
|
||||
|
||||
public function testAddHeader(){
|
||||
$this->childResponse->addHeader('hello', 'world');
|
||||
$headers = $this->childResponse->getHeaders();
|
||||
$this->assertEquals('world', $headers['hello']);
|
||||
}
|
||||
|
||||
|
||||
public function testAddHeaderValueNullDeletesIt(){
|
||||
$this->childResponse->addHeader('hello', 'world');
|
||||
$this->childResponse->addHeader('hello', null);
|
||||
$this->assertEquals(1, count($this->childResponse->getHeaders()));
|
||||
}
|
||||
|
||||
|
||||
public function testCacheHeadersAreDisabledByDefault(){
|
||||
$headers = $this->childResponse->getHeaders();
|
||||
$this->assertEquals('no-cache, must-revalidate', $headers['Cache-Control']);
|
||||
}
|
||||
|
||||
|
||||
public function testRenderReturnNullByDefault(){
|
||||
$this->assertEquals(null, $this->childResponse->render());
|
||||
}
|
||||
|
||||
|
||||
public function testGetStatus() {
|
||||
$default = $this->childResponse->getStatus();
|
||||
|
||||
$this->childResponse->setStatus(Http::STATUS_NOT_FOUND);
|
||||
|
||||
$this->assertEquals(Http::STATUS_OK, $default);
|
||||
$this->assertEquals(Http::STATUS_NOT_FOUND, $this->childResponse->getStatus());
|
||||
}
|
||||
|
||||
|
||||
public function testGetEtag() {
|
||||
$this->childResponse->setEtag('hi');
|
||||
$this->assertEquals('hi', $this->childResponse->getEtag());
|
||||
}
|
||||
|
||||
|
||||
public function testGetLastModified() {
|
||||
$lastModified = new \DateTime(null, new \DateTimeZone('GMT'));
|
||||
$lastModified->setTimestamp(1);
|
||||
$this->childResponse->setLastModified($lastModified);
|
||||
$this->assertEquals($lastModified, $this->childResponse->getLastModified());
|
||||
}
|
||||
|
||||
|
||||
|
||||
public function testCacheSecondsZero() {
|
||||
$this->childResponse->cacheFor(0);
|
||||
|
||||
$headers = $this->childResponse->getHeaders();
|
||||
$this->assertEquals('no-cache, must-revalidate', $headers['Cache-Control']);
|
||||
}
|
||||
|
||||
|
||||
public function testCacheSeconds() {
|
||||
$this->childResponse->cacheFor(33);
|
||||
|
||||
$headers = $this->childResponse->getHeaders();
|
||||
$this->assertEquals('max-age=33, must-revalidate',
|
||||
$headers['Cache-Control']);
|
||||
}
|
||||
|
||||
|
||||
|
||||
public function testEtagLastModifiedHeaders() {
|
||||
$lastModified = new \DateTime(null, new \DateTimeZone('GMT'));
|
||||
$lastModified->setTimestamp(1);
|
||||
$this->childResponse->setLastModified($lastModified);
|
||||
$headers = $this->childResponse->getHeaders();
|
||||
$this->assertEquals('Thu, 01 Jan 1970 00:00:01 +0000', $headers['Last-Modified']);
|
||||
}
|
||||
|
||||
|
||||
}
|
|
@ -0,0 +1,161 @@
|
|||
<?php
|
||||
|
||||
/**
|
||||
* ownCloud - App Framework
|
||||
*
|
||||
* @author Bernhard Posselt
|
||||
* @copyright 2012 Bernhard Posselt nukeawhale@gmail.com
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 3 of the License, or any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU AFFERO GENERAL PUBLIC LICENSE for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public
|
||||
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
*/
|
||||
|
||||
|
||||
namespace OC\AppFramework\Http;
|
||||
|
||||
use OCP\AppFramework\Http\TemplateResponse;
|
||||
|
||||
|
||||
class TemplateResponseTest extends \PHPUnit_Framework_TestCase {
|
||||
|
||||
/**
|
||||
* @var \OCP\AppFramework\Http\TemplateResponse
|
||||
*/
|
||||
private $tpl;
|
||||
|
||||
/**
|
||||
* @var \OCP\AppFramework\IApi
|
||||
*/
|
||||
private $api;
|
||||
|
||||
protected function setUp() {
|
||||
$this->api = $this->getMock('OC\AppFramework\Core\API',
|
||||
array('getAppName'), array('test'));
|
||||
$this->api->expects($this->any())
|
||||
->method('getAppName')
|
||||
->will($this->returnValue('app'));
|
||||
|
||||
$this->tpl = new TemplateResponse($this->api, 'home');
|
||||
}
|
||||
|
||||
|
||||
public function testSetParams(){
|
||||
$params = array('hi' => 'yo');
|
||||
$this->tpl->setParams($params);
|
||||
|
||||
$this->assertEquals(array('hi' => 'yo'), $this->tpl->getParams());
|
||||
}
|
||||
|
||||
|
||||
public function testGetTemplateName(){
|
||||
$this->assertEquals('home', $this->tpl->getTemplateName());
|
||||
}
|
||||
|
||||
|
||||
public function testRender(){
|
||||
$ocTpl = $this->getMock('Template', array('fetchPage'));
|
||||
$ocTpl->expects($this->once())
|
||||
->method('fetchPage');
|
||||
|
||||
$api = $this->getMock('OC\AppFramework\Core\API',
|
||||
array('getAppName', 'getTemplate'), array('app'));
|
||||
$api->expects($this->any())
|
||||
->method('getAppName')
|
||||
->will($this->returnValue('app'));
|
||||
$api->expects($this->once())
|
||||
->method('getTemplate')
|
||||
->with($this->equalTo('home'), $this->equalTo('user'), $this->equalTo('app'))
|
||||
->will($this->returnValue($ocTpl));
|
||||
|
||||
$tpl = new TemplateResponse($api, 'home');
|
||||
|
||||
$tpl->render();
|
||||
}
|
||||
|
||||
|
||||
public function testRenderAssignsParams(){
|
||||
$params = array('john' => 'doe');
|
||||
|
||||
$ocTpl = $this->getMock('Template', array('assign', 'fetchPage'));
|
||||
$ocTpl->expects($this->once())
|
||||
->method('assign')
|
||||
->with($this->equalTo('john'), $this->equalTo('doe'));
|
||||
|
||||
$api = $this->getMock('OC\AppFramework\Core\API',
|
||||
array('getAppName', 'getTemplate'), array('app'));
|
||||
$api->expects($this->any())
|
||||
->method('getAppName')
|
||||
->will($this->returnValue('app'));
|
||||
$api->expects($this->once())
|
||||
->method('getTemplate')
|
||||
->with($this->equalTo('home'), $this->equalTo('user'), $this->equalTo('app'))
|
||||
->will($this->returnValue($ocTpl));
|
||||
|
||||
$tpl = new TemplateResponse($api, 'home');
|
||||
$tpl->setParams($params);
|
||||
|
||||
$tpl->render();
|
||||
}
|
||||
|
||||
|
||||
public function testRenderDifferentApp(){
|
||||
$ocTpl = $this->getMock('Template', array('fetchPage'));
|
||||
$ocTpl->expects($this->once())
|
||||
->method('fetchPage');
|
||||
|
||||
$api = $this->getMock('OC\AppFramework\Core\API',
|
||||
array('getAppName', 'getTemplate'), array('app'));
|
||||
$api->expects($this->any())
|
||||
->method('getAppName')
|
||||
->will($this->returnValue('app'));
|
||||
$api->expects($this->once())
|
||||
->method('getTemplate')
|
||||
->with($this->equalTo('home'), $this->equalTo('user'), $this->equalTo('app2'))
|
||||
->will($this->returnValue($ocTpl));
|
||||
|
||||
$tpl = new TemplateResponse($api, 'home', 'app2');
|
||||
|
||||
$tpl->render();
|
||||
}
|
||||
|
||||
|
||||
public function testRenderDifferentRenderAs(){
|
||||
$ocTpl = $this->getMock('Template', array('fetchPage'));
|
||||
$ocTpl->expects($this->once())
|
||||
->method('fetchPage');
|
||||
|
||||
$api = $this->getMock('OC\AppFramework\Core\API',
|
||||
array('getAppName', 'getTemplate'), array('app'));
|
||||
$api->expects($this->any())
|
||||
->method('getAppName')
|
||||
->will($this->returnValue('app'));
|
||||
$api->expects($this->once())
|
||||
->method('getTemplate')
|
||||
->with($this->equalTo('home'), $this->equalTo('admin'), $this->equalTo('app'))
|
||||
->will($this->returnValue($ocTpl));
|
||||
|
||||
$tpl = new TemplateResponse($api, 'home');
|
||||
$tpl->renderAs('admin');
|
||||
|
||||
$tpl->render();
|
||||
}
|
||||
|
||||
|
||||
public function testGetRenderAs(){
|
||||
$render = 'myrender';
|
||||
$this->tpl->renderAs($render);
|
||||
$this->assertEquals($render, $this->tpl->getRenderAs());
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,285 @@
|
|||
<?php
|
||||
|
||||
/**
|
||||
* ownCloud - App Framework
|
||||
*
|
||||
* @author Bernhard Posselt
|
||||
* @copyright 2012 Bernhard Posselt nukeawhale@gmail.com
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 3 of the License, or any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU AFFERO GENERAL PUBLIC LICENSE for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public
|
||||
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
*/
|
||||
|
||||
|
||||
namespace OC\AppFramework;
|
||||
|
||||
use OC\AppFramework\Http\Request;
|
||||
use OC\AppFramework\Middleware\Middleware;
|
||||
use OC\AppFramework\Middleware\MiddlewareDispatcher;
|
||||
use OCP\AppFramework\Http\Response;
|
||||
|
||||
|
||||
// needed to test ordering
|
||||
class TestMiddleware extends Middleware {
|
||||
public static $beforeControllerCalled = 0;
|
||||
public static $afterControllerCalled = 0;
|
||||
public static $afterExceptionCalled = 0;
|
||||
public static $beforeOutputCalled = 0;
|
||||
|
||||
public $beforeControllerOrder = 0;
|
||||
public $afterControllerOrder = 0;
|
||||
public $afterExceptionOrder = 0;
|
||||
public $beforeOutputOrder = 0;
|
||||
|
||||
public $controller;
|
||||
public $methodName;
|
||||
public $exception;
|
||||
public $response;
|
||||
public $output;
|
||||
|
||||
private $beforeControllerThrowsEx;
|
||||
|
||||
public function __construct($beforeControllerThrowsEx) {
|
||||
self::$beforeControllerCalled = 0;
|
||||
self::$afterControllerCalled = 0;
|
||||
self::$afterExceptionCalled = 0;
|
||||
self::$beforeOutputCalled = 0;
|
||||
$this->beforeControllerThrowsEx = $beforeControllerThrowsEx;
|
||||
}
|
||||
|
||||
public function beforeController($controller, $methodName){
|
||||
self::$beforeControllerCalled++;
|
||||
$this->beforeControllerOrder = self::$beforeControllerCalled;
|
||||
$this->controller = $controller;
|
||||
$this->methodName = $methodName;
|
||||
if($this->beforeControllerThrowsEx){
|
||||
throw new \Exception();
|
||||
}
|
||||
}
|
||||
|
||||
public function afterException($controller, $methodName, \Exception $exception){
|
||||
self::$afterExceptionCalled++;
|
||||
$this->afterExceptionOrder = self::$afterExceptionCalled;
|
||||
$this->controller = $controller;
|
||||
$this->methodName = $methodName;
|
||||
$this->exception = $exception;
|
||||
parent::afterException($controller, $methodName, $exception);
|
||||
}
|
||||
|
||||
public function afterController($controller, $methodName, Response $response){
|
||||
self::$afterControllerCalled++;
|
||||
$this->afterControllerOrder = self::$afterControllerCalled;
|
||||
$this->controller = $controller;
|
||||
$this->methodName = $methodName;
|
||||
$this->response = $response;
|
||||
return parent::afterController($controller, $methodName, $response);
|
||||
}
|
||||
|
||||
public function beforeOutput($controller, $methodName, $output){
|
||||
self::$beforeOutputCalled++;
|
||||
$this->beforeOutputOrder = self::$beforeOutputCalled;
|
||||
$this->controller = $controller;
|
||||
$this->methodName = $methodName;
|
||||
$this->output = $output;
|
||||
return parent::beforeOutput($controller, $methodName, $output);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
class MiddlewareDispatcherTest extends \PHPUnit_Framework_TestCase {
|
||||
|
||||
public $exception;
|
||||
public $response;
|
||||
private $out;
|
||||
private $method;
|
||||
private $controller;
|
||||
|
||||
/**
|
||||
* @var MiddlewareDispatcher
|
||||
*/
|
||||
private $dispatcher;
|
||||
|
||||
|
||||
public function setUp() {
|
||||
$this->dispatcher = new MiddlewareDispatcher();
|
||||
$this->controller = $this->getControllerMock();
|
||||
$this->method = 'method';
|
||||
$this->response = new Response();
|
||||
$this->out = 'hi';
|
||||
$this->exception = new \Exception();
|
||||
}
|
||||
|
||||
|
||||
private function getAPIMock(){
|
||||
return $this->getMock('OC\AppFramework\Core\API',
|
||||
array('getAppName'), array('app'));
|
||||
}
|
||||
|
||||
|
||||
private function getControllerMock(){
|
||||
return $this->getMock('OC\AppFramework\Controller\Controller', array('method'),
|
||||
array($this->getAPIMock(), new Request()));
|
||||
}
|
||||
|
||||
|
||||
private function getMiddleware($beforeControllerThrowsEx=false){
|
||||
$m1 = new TestMiddleware($beforeControllerThrowsEx);
|
||||
$this->dispatcher->registerMiddleware($m1);
|
||||
return $m1;
|
||||
}
|
||||
|
||||
|
||||
public function testAfterExceptionShouldReturnResponseOfMiddleware(){
|
||||
$response = new Response();
|
||||
$m1 = $this->getMock('\OC\AppFramework\Middleware\Middleware',
|
||||
array('afterException', 'beforeController'));
|
||||
$m1->expects($this->never())
|
||||
->method('afterException');
|
||||
|
||||
$m2 = $this->getMock('OC\AppFramework\Middleware\Middleware',
|
||||
array('afterException', 'beforeController'));
|
||||
$m2->expects($this->once())
|
||||
->method('afterException')
|
||||
->will($this->returnValue($response));
|
||||
|
||||
$this->dispatcher->registerMiddleware($m1);
|
||||
$this->dispatcher->registerMiddleware($m2);
|
||||
|
||||
$this->dispatcher->beforeController($this->controller, $this->method);
|
||||
$this->assertEquals($response, $this->dispatcher->afterException($this->controller, $this->method, $this->exception));
|
||||
}
|
||||
|
||||
|
||||
public function testAfterExceptionShouldThrowAgainWhenNotHandled(){
|
||||
$m1 = new TestMiddleware(false);
|
||||
$m2 = new TestMiddleware(true);
|
||||
|
||||
$this->dispatcher->registerMiddleware($m1);
|
||||
$this->dispatcher->registerMiddleware($m2);
|
||||
|
||||
$this->setExpectedException('\Exception');
|
||||
$this->dispatcher->beforeController($this->controller, $this->method);
|
||||
$this->dispatcher->afterException($this->controller, $this->method, $this->exception);
|
||||
}
|
||||
|
||||
|
||||
public function testBeforeControllerCorrectArguments(){
|
||||
$m1 = $this->getMiddleware();
|
||||
$this->dispatcher->beforeController($this->controller, $this->method);
|
||||
|
||||
$this->assertEquals($this->controller, $m1->controller);
|
||||
$this->assertEquals($this->method, $m1->methodName);
|
||||
}
|
||||
|
||||
|
||||
public function testAfterControllerCorrectArguments(){
|
||||
$m1 = $this->getMiddleware();
|
||||
|
||||
$this->dispatcher->afterController($this->controller, $this->method, $this->response);
|
||||
|
||||
$this->assertEquals($this->controller, $m1->controller);
|
||||
$this->assertEquals($this->method, $m1->methodName);
|
||||
$this->assertEquals($this->response, $m1->response);
|
||||
}
|
||||
|
||||
|
||||
public function testAfterExceptionCorrectArguments(){
|
||||
$m1 = $this->getMiddleware();
|
||||
|
||||
$this->setExpectedException('\Exception');
|
||||
|
||||
$this->dispatcher->beforeController($this->controller, $this->method);
|
||||
$this->dispatcher->afterException($this->controller, $this->method, $this->exception);
|
||||
|
||||
$this->assertEquals($this->controller, $m1->controller);
|
||||
$this->assertEquals($this->method, $m1->methodName);
|
||||
$this->assertEquals($this->exception, $m1->exception);
|
||||
}
|
||||
|
||||
|
||||
public function testBeforeOutputCorrectArguments(){
|
||||
$m1 = $this->getMiddleware();
|
||||
|
||||
$this->dispatcher->beforeOutput($this->controller, $this->method, $this->out);
|
||||
|
||||
$this->assertEquals($this->controller, $m1->controller);
|
||||
$this->assertEquals($this->method, $m1->methodName);
|
||||
$this->assertEquals($this->out, $m1->output);
|
||||
}
|
||||
|
||||
|
||||
public function testBeforeControllerOrder(){
|
||||
$m1 = $this->getMiddleware();
|
||||
$m2 = $this->getMiddleware();
|
||||
|
||||
$this->dispatcher->beforeController($this->controller, $this->method);
|
||||
|
||||
$this->assertEquals(1, $m1->beforeControllerOrder);
|
||||
$this->assertEquals(2, $m2->beforeControllerOrder);
|
||||
}
|
||||
|
||||
public function testAfterControllerOrder(){
|
||||
$m1 = $this->getMiddleware();
|
||||
$m2 = $this->getMiddleware();
|
||||
|
||||
$this->dispatcher->afterController($this->controller, $this->method, $this->response);
|
||||
|
||||
$this->assertEquals(2, $m1->afterControllerOrder);
|
||||
$this->assertEquals(1, $m2->afterControllerOrder);
|
||||
}
|
||||
|
||||
|
||||
public function testAfterExceptionOrder(){
|
||||
$m1 = $this->getMiddleware();
|
||||
$m2 = $this->getMiddleware();
|
||||
|
||||
$this->setExpectedException('\Exception');
|
||||
$this->dispatcher->beforeController($this->controller, $this->method);
|
||||
$this->dispatcher->afterException($this->controller, $this->method, $this->exception);
|
||||
|
||||
$this->assertEquals(1, $m1->afterExceptionOrder);
|
||||
$this->assertEquals(1, $m2->afterExceptionOrder);
|
||||
}
|
||||
|
||||
|
||||
public function testBeforeOutputOrder(){
|
||||
$m1 = $this->getMiddleware();
|
||||
$m2 = $this->getMiddleware();
|
||||
|
||||
$this->dispatcher->beforeOutput($this->controller, $this->method, $this->out);
|
||||
|
||||
$this->assertEquals(2, $m1->beforeOutputOrder);
|
||||
$this->assertEquals(1, $m2->beforeOutputOrder);
|
||||
}
|
||||
|
||||
|
||||
public function testExceptionShouldRunAfterExceptionOfOnlyPreviouslyExecutedMiddlewares(){
|
||||
$m1 = $this->getMiddleware();
|
||||
$m2 = $this->getMiddleware(true);
|
||||
$m3 = $this->getMock('\OC\AppFramework\Middleware\Middleware');
|
||||
$m3->expects($this->never())
|
||||
->method('afterException');
|
||||
$m3->expects($this->never())
|
||||
->method('beforeController');
|
||||
$m3->expects($this->never())
|
||||
->method('afterController');
|
||||
|
||||
$this->dispatcher->registerMiddleware($m3);
|
||||
|
||||
$this->dispatcher->beforeOutput($this->controller, $this->method, $this->out);
|
||||
|
||||
$this->assertEquals(2, $m1->beforeOutputOrder);
|
||||
$this->assertEquals(1, $m2->beforeOutputOrder);
|
||||
}
|
||||
}
|
|
@ -0,0 +1,83 @@
|
|||
<?php
|
||||
|
||||
/**
|
||||
* ownCloud - App Framework
|
||||
*
|
||||
* @author Bernhard Posselt
|
||||
* @copyright 2012 Bernhard Posselt nukeawhale@gmail.com
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 3 of the License, or any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU AFFERO GENERAL PUBLIC LICENSE for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public
|
||||
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
*/
|
||||
|
||||
|
||||
namespace OC\AppFramework;
|
||||
|
||||
use OC\AppFramework\Http\Request;
|
||||
use OC\AppFramework\Middleware\Middleware;
|
||||
|
||||
|
||||
class ChildMiddleware extends Middleware {};
|
||||
|
||||
|
||||
class MiddlewareTest extends \PHPUnit_Framework_TestCase {
|
||||
|
||||
/**
|
||||
* @var Middleware
|
||||
*/
|
||||
private $middleware;
|
||||
private $controller;
|
||||
private $exception;
|
||||
private $api;
|
||||
|
||||
protected function setUp(){
|
||||
$this->middleware = new ChildMiddleware();
|
||||
|
||||
$this->api = $this->getMock('OC\AppFramework\Core\API',
|
||||
array(), array('test'));
|
||||
|
||||
$this->controller = $this->getMock('OC\AppFramework\Controller\Controller',
|
||||
array(), array($this->api, new Request()));
|
||||
$this->exception = new \Exception();
|
||||
$this->response = $this->getMock('OCP\AppFramework\Http\Response');
|
||||
}
|
||||
|
||||
|
||||
public function testBeforeController() {
|
||||
$this->middleware->beforeController($this->controller, null);
|
||||
$this->assertNull(null);
|
||||
}
|
||||
|
||||
|
||||
public function testAfterExceptionRaiseAgainWhenUnhandled() {
|
||||
$this->setExpectedException('Exception');
|
||||
$afterEx = $this->middleware->afterException($this->controller, null, $this->exception);
|
||||
}
|
||||
|
||||
|
||||
public function testAfterControllerReturnResponseWhenUnhandled() {
|
||||
$response = $this->middleware->afterController($this->controller, null, $this->response);
|
||||
|
||||
$this->assertEquals($this->response, $response);
|
||||
}
|
||||
|
||||
|
||||
public function testBeforeOutputReturnOutputhenUnhandled() {
|
||||
$output = $this->middleware->beforeOutput($this->controller, null, 'test');
|
||||
|
||||
$this->assertEquals('test', $output);
|
||||
}
|
||||
|
||||
|
||||
}
|
|
@ -0,0 +1,296 @@
|
|||
<?php
|
||||
|
||||
/**
|
||||
* ownCloud - App Framework
|
||||
*
|
||||
* @author Bernhard Posselt
|
||||
* @copyright 2012 Bernhard Posselt nukeawhale@gmail.com
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 3 of the License, or any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU AFFERO GENERAL PUBLIC LICENSE for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public
|
||||
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
*/
|
||||
|
||||
|
||||
namespace OC\AppFramework\Middleware\Security;
|
||||
|
||||
use OC\AppFramework\Http\Http;
|
||||
use OC\AppFramework\Http\Request;
|
||||
use OC\AppFramework\Http\RedirectResponse;
|
||||
use OCP\AppFramework\Http\JSONResponse;
|
||||
|
||||
|
||||
class SecurityMiddlewareTest extends \PHPUnit_Framework_TestCase {
|
||||
|
||||
private $middleware;
|
||||
private $controller;
|
||||
private $secException;
|
||||
private $secAjaxException;
|
||||
private $request;
|
||||
|
||||
public function setUp() {
|
||||
$api = $this->getMock('OC\AppFramework\Core\API', array(), array('test'));
|
||||
$this->controller = $this->getMock('OC\AppFramework\Controller\Controller',
|
||||
array(), array($api, new Request()));
|
||||
|
||||
$this->request = new Request();
|
||||
$this->middleware = new SecurityMiddleware($api, $this->request);
|
||||
$this->secException = new SecurityException('hey', false);
|
||||
$this->secAjaxException = new SecurityException('hey', true);
|
||||
}
|
||||
|
||||
|
||||
private function getAPI(){
|
||||
return $this->getMock('OC\AppFramework\Core\API',
|
||||
array('isLoggedIn', 'passesCSRFCheck', 'isAdminUser',
|
||||
'isSubAdminUser', 'activateNavigationEntry',
|
||||
'getUserId'),
|
||||
array('app'));
|
||||
}
|
||||
|
||||
|
||||
private function checkNavEntry($method, $shouldBeActivated=false){
|
||||
$api = $this->getAPI();
|
||||
|
||||
if($shouldBeActivated){
|
||||
$api->expects($this->once())
|
||||
->method('activateNavigationEntry');
|
||||
} else {
|
||||
$api->expects($this->never())
|
||||
->method('activateNavigationEntry');
|
||||
}
|
||||
|
||||
$sec = new SecurityMiddleware($api, $this->request);
|
||||
$sec->beforeController('\OC\AppFramework\Middleware\Security\SecurityMiddlewareTest', $method);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @PublicPage
|
||||
* @NoCSRFRequired
|
||||
*/
|
||||
public function testSetNavigationEntry(){
|
||||
$this->checkNavEntry('testSetNavigationEntry', true);
|
||||
}
|
||||
|
||||
|
||||
private function ajaxExceptionStatus($method, $test, $status) {
|
||||
$api = $this->getAPI();
|
||||
$api->expects($this->any())
|
||||
->method($test)
|
||||
->will($this->returnValue(false));
|
||||
|
||||
// isAdminUser requires isLoggedIn call to return true
|
||||
if ($test === 'isAdminUser') {
|
||||
$api->expects($this->any())
|
||||
->method('isLoggedIn')
|
||||
->will($this->returnValue(true));
|
||||
}
|
||||
|
||||
$sec = new SecurityMiddleware($api, $this->request);
|
||||
|
||||
try {
|
||||
$sec->beforeController('\OC\AppFramework\Middleware\Security\SecurityMiddlewareTest',
|
||||
$method);
|
||||
} catch (SecurityException $ex){
|
||||
$this->assertEquals($status, $ex->getCode());
|
||||
}
|
||||
}
|
||||
|
||||
public function testAjaxStatusLoggedInCheck() {
|
||||
$this->ajaxExceptionStatus(
|
||||
'testAjaxStatusLoggedInCheck',
|
||||
'isLoggedIn',
|
||||
Http::STATUS_UNAUTHORIZED
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* @NoCSRFRequired
|
||||
* @NoAdminRequired
|
||||
*/
|
||||
public function testAjaxNotAdminCheck() {
|
||||
$this->ajaxExceptionStatus(
|
||||
'testAjaxNotAdminCheck',
|
||||
'isAdminUser',
|
||||
Http::STATUS_FORBIDDEN
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* @PublicPage
|
||||
*/
|
||||
public function testAjaxStatusCSRFCheck() {
|
||||
$this->ajaxExceptionStatus(
|
||||
'testAjaxStatusCSRFCheck',
|
||||
'passesCSRFCheck',
|
||||
Http::STATUS_PRECONDITION_FAILED
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* @PublicPage
|
||||
* @NoCSRFRequired
|
||||
*/
|
||||
public function testAjaxStatusAllGood() {
|
||||
$this->ajaxExceptionStatus(
|
||||
'testAjaxStatusAllGood',
|
||||
'isLoggedIn',
|
||||
0
|
||||
);
|
||||
$this->ajaxExceptionStatus(
|
||||
'testAjaxStatusAllGood',
|
||||
'isAdminUser',
|
||||
0
|
||||
);
|
||||
$this->ajaxExceptionStatus(
|
||||
'testAjaxStatusAllGood',
|
||||
'isSubAdminUser',
|
||||
0
|
||||
);
|
||||
$this->ajaxExceptionStatus(
|
||||
'testAjaxStatusAllGood',
|
||||
'passesCSRFCheck',
|
||||
0
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @PublicPage
|
||||
* @NoCSRFRequired
|
||||
*/
|
||||
public function testNoChecks(){
|
||||
$api = $this->getAPI();
|
||||
$api->expects($this->never())
|
||||
->method('passesCSRFCheck')
|
||||
->will($this->returnValue(true));
|
||||
$api->expects($this->never())
|
||||
->method('isAdminUser')
|
||||
->will($this->returnValue(true));
|
||||
$api->expects($this->never())
|
||||
->method('isLoggedIn')
|
||||
->will($this->returnValue(true));
|
||||
|
||||
$sec = new SecurityMiddleware($api, $this->request);
|
||||
$sec->beforeController('\OC\AppFramework\Middleware\Security\SecurityMiddlewareTest',
|
||||
'testNoChecks');
|
||||
}
|
||||
|
||||
|
||||
private function securityCheck($method, $expects, $shouldFail=false){
|
||||
$api = $this->getAPI();
|
||||
$api->expects($this->once())
|
||||
->method($expects)
|
||||
->will($this->returnValue(!$shouldFail));
|
||||
|
||||
// admin check requires login
|
||||
if ($expects === 'isAdminUser') {
|
||||
$api->expects($this->once())
|
||||
->method('isLoggedIn')
|
||||
->will($this->returnValue(true));
|
||||
}
|
||||
|
||||
$sec = new SecurityMiddleware($api, $this->request);
|
||||
|
||||
if($shouldFail){
|
||||
$this->setExpectedException('\OC\AppFramework\Middleware\Security\SecurityException');
|
||||
} else {
|
||||
$this->setExpectedException(null);
|
||||
}
|
||||
|
||||
$sec->beforeController('\OC\AppFramework\Middleware\Security\SecurityMiddlewareTest', $method);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @PublicPage
|
||||
*/
|
||||
public function testCsrfCheck(){
|
||||
$this->securityCheck('testCsrfCheck', 'passesCSRFCheck');
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @PublicPage
|
||||
*/
|
||||
public function testFailCsrfCheck(){
|
||||
$this->securityCheck('testFailCsrfCheck', 'passesCSRFCheck', true);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @NoCSRFRequired
|
||||
* @NoAdminRequired
|
||||
*/
|
||||
public function testLoggedInCheck(){
|
||||
$this->securityCheck('testLoggedInCheck', 'isLoggedIn');
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @NoCSRFRequired
|
||||
* @NoAdminRequired
|
||||
*/
|
||||
public function testFailLoggedInCheck(){
|
||||
$this->securityCheck('testFailLoggedInCheck', 'isLoggedIn', true);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @NoCSRFRequired
|
||||
*/
|
||||
public function testIsAdminCheck(){
|
||||
$this->securityCheck('testIsAdminCheck', 'isAdminUser');
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @NoCSRFRequired
|
||||
*/
|
||||
public function testFailIsAdminCheck(){
|
||||
$this->securityCheck('testFailIsAdminCheck', 'isAdminUser', true);
|
||||
}
|
||||
|
||||
|
||||
public function testAfterExceptionNotCaughtThrowsItAgain(){
|
||||
$ex = new \Exception();
|
||||
$this->setExpectedException('\Exception');
|
||||
$this->middleware->afterException($this->controller, 'test', $ex);
|
||||
}
|
||||
|
||||
|
||||
public function testAfterExceptionReturnsRedirect(){
|
||||
$api = $this->getMock('OC\AppFramework\Core\API', array(), array('test'));
|
||||
$this->controller = $this->getMock('OC\AppFramework\Controller\Controller',
|
||||
array(), array($api, new Request()));
|
||||
|
||||
$this->request = new Request(
|
||||
array('server' => array('HTTP_ACCEPT' => 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8')));
|
||||
$this->middleware = new SecurityMiddleware($api, $this->request);
|
||||
$response = $this->middleware->afterException($this->controller, 'test',
|
||||
$this->secException);
|
||||
|
||||
$this->assertTrue($response instanceof RedirectResponse);
|
||||
}
|
||||
|
||||
|
||||
public function testAfterAjaxExceptionReturnsJSONError(){
|
||||
$response = $this->middleware->afterException($this->controller, 'test',
|
||||
$this->secAjaxException);
|
||||
|
||||
$this->assertTrue($response instanceof JSONResponse);
|
||||
}
|
||||
|
||||
|
||||
}
|
|
@ -0,0 +1,213 @@
|
|||
<?php
|
||||
|
||||
namespace OC\AppFramework\Routing;
|
||||
|
||||
use OC\AppFramework\DependencyInjection\DIContainer;
|
||||
use OC\AppFramework\routing\RouteConfig;
|
||||
|
||||
|
||||
class RouteConfigTest extends \PHPUnit_Framework_TestCase
|
||||
{
|
||||
|
||||
public function testSimpleRoute()
|
||||
{
|
||||
$routes = array('routes' => array(
|
||||
array('name' => 'folders#open', 'url' => '/folders/{folderId}/open', 'verb' => 'GET')
|
||||
));
|
||||
|
||||
$this->assertSimpleRoute($routes, 'folders.open', 'GET', '/folders/{folderId}/open', 'FoldersController', 'open');
|
||||
}
|
||||
|
||||
public function testSimpleRouteWithMissingVerb()
|
||||
{
|
||||
$routes = array('routes' => array(
|
||||
array('name' => 'folders#open', 'url' => '/folders/{folderId}/open')
|
||||
));
|
||||
|
||||
$this->assertSimpleRoute($routes, 'folders.open', 'GET', '/folders/{folderId}/open', 'FoldersController', 'open');
|
||||
}
|
||||
|
||||
public function testSimpleRouteWithLowercaseVerb()
|
||||
{
|
||||
$routes = array('routes' => array(
|
||||
array('name' => 'folders#open', 'url' => '/folders/{folderId}/open', 'verb' => 'delete')
|
||||
));
|
||||
|
||||
$this->assertSimpleRoute($routes, 'folders.open', 'DELETE', '/folders/{folderId}/open', 'FoldersController', 'open');
|
||||
}
|
||||
|
||||
/**
|
||||
* @expectedException \UnexpectedValueException
|
||||
*/
|
||||
public function testSimpleRouteWithBrokenName()
|
||||
{
|
||||
$routes = array('routes' => array(
|
||||
array('name' => 'folders_open', 'url' => '/folders/{folderId}/open', 'verb' => 'delete')
|
||||
));
|
||||
|
||||
// router mock
|
||||
$router = $this->getMock("\OC_Router", array('create'));
|
||||
|
||||
// load route configuration
|
||||
$container = new DIContainer('app1');
|
||||
$config = new RouteConfig($container, $router, $routes);
|
||||
|
||||
$config->register();
|
||||
}
|
||||
|
||||
public function testSimpleRouteWithUnderScoreNames()
|
||||
{
|
||||
$routes = array('routes' => array(
|
||||
array('name' => 'admin_folders#open_current', 'url' => '/folders/{folderId}/open', 'verb' => 'delete')
|
||||
));
|
||||
|
||||
$this->assertSimpleRoute($routes, 'admin_folders.open_current', 'DELETE', '/folders/{folderId}/open', 'AdminFoldersController', 'openCurrent');
|
||||
}
|
||||
|
||||
public function testResource()
|
||||
{
|
||||
$routes = array('resources' => array('accounts' => array('url' => '/accounts')));
|
||||
|
||||
$this->assertResource($routes, 'accounts', '/accounts', 'AccountsController', 'accountId');
|
||||
}
|
||||
|
||||
public function testResourceWithUnderScoreName()
|
||||
{
|
||||
$routes = array('resources' => array('admin_accounts' => array('url' => '/admin/accounts')));
|
||||
|
||||
$this->assertResource($routes, 'admin_accounts', '/admin/accounts', 'AdminAccountsController', 'adminAccountId');
|
||||
}
|
||||
|
||||
private function assertSimpleRoute($routes, $name, $verb, $url, $controllerName, $actionName)
|
||||
{
|
||||
// route mocks
|
||||
$route = $this->mockRoute($verb, $controllerName, $actionName);
|
||||
|
||||
// router mock
|
||||
$router = $this->getMock("\OC_Router", array('create'));
|
||||
|
||||
// we expect create to be called once:
|
||||
$router
|
||||
->expects($this->once())
|
||||
->method('create')
|
||||
->with($this->equalTo('app1.' . $name), $this->equalTo($url))
|
||||
->will($this->returnValue($route));
|
||||
|
||||
// load route configuration
|
||||
$container = new DIContainer('app1');
|
||||
$config = new RouteConfig($container, $router, $routes);
|
||||
|
||||
$config->register();
|
||||
}
|
||||
|
||||
private function assertResource($yaml, $resourceName, $url, $controllerName, $paramName)
|
||||
{
|
||||
// router mock
|
||||
$router = $this->getMock("\OC_Router", array('create'));
|
||||
|
||||
// route mocks
|
||||
$indexRoute = $this->mockRoute('GET', $controllerName, 'index');
|
||||
$showRoute = $this->mockRoute('GET', $controllerName, 'show');
|
||||
$createRoute = $this->mockRoute('POST', $controllerName, 'create');
|
||||
$updateRoute = $this->mockRoute('PUT', $controllerName, 'update');
|
||||
$destroyRoute = $this->mockRoute('DELETE', $controllerName, 'destroy');
|
||||
|
||||
$urlWithParam = $url . '/{' . $paramName . '}';
|
||||
|
||||
// we expect create to be called once:
|
||||
$router
|
||||
->expects($this->at(0))
|
||||
->method('create')
|
||||
->with($this->equalTo('app1.' . $resourceName . '.index'), $this->equalTo($url))
|
||||
->will($this->returnValue($indexRoute));
|
||||
|
||||
$router
|
||||
->expects($this->at(1))
|
||||
->method('create')
|
||||
->with($this->equalTo('app1.' . $resourceName . '.show'), $this->equalTo($urlWithParam))
|
||||
->will($this->returnValue($showRoute));
|
||||
|
||||
$router
|
||||
->expects($this->at(2))
|
||||
->method('create')
|
||||
->with($this->equalTo('app1.' . $resourceName . '.create'), $this->equalTo($url))
|
||||
->will($this->returnValue($createRoute));
|
||||
|
||||
$router
|
||||
->expects($this->at(3))
|
||||
->method('create')
|
||||
->with($this->equalTo('app1.' . $resourceName . '.update'), $this->equalTo($urlWithParam))
|
||||
->will($this->returnValue($updateRoute));
|
||||
|
||||
$router
|
||||
->expects($this->at(4))
|
||||
->method('create')
|
||||
->with($this->equalTo('app1.' . $resourceName . '.destroy'), $this->equalTo($urlWithParam))
|
||||
->will($this->returnValue($destroyRoute));
|
||||
|
||||
// load route configuration
|
||||
$container = new DIContainer('app1');
|
||||
$config = new RouteConfig($container, $router, $yaml);
|
||||
|
||||
$config->register();
|
||||
}
|
||||
|
||||
/**
|
||||
* @param $verb
|
||||
* @param $controllerName
|
||||
* @param $actionName
|
||||
* @return \PHPUnit_Framework_MockObject_MockObject
|
||||
*/
|
||||
private function mockRoute($verb, $controllerName, $actionName)
|
||||
{
|
||||
$container = new DIContainer('app1');
|
||||
$route = $this->getMock("\OC_Route", array('method', 'action'), array(), '', false);
|
||||
$route
|
||||
->expects($this->exactly(1))
|
||||
->method('method')
|
||||
->with($this->equalTo($verb))
|
||||
->will($this->returnValue($route));
|
||||
|
||||
$route
|
||||
->expects($this->exactly(1))
|
||||
->method('action')
|
||||
->with($this->equalTo(new RouteActionHandler($container, $controllerName, $actionName)))
|
||||
->will($this->returnValue($route));
|
||||
return $route;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/*
|
||||
#
|
||||
# sample routes.yaml for ownCloud
|
||||
#
|
||||
# the section simple describes one route
|
||||
|
||||
routes:
|
||||
- name: folders#open
|
||||
url: /folders/{folderId}/open
|
||||
verb: GET
|
||||
# controller: name.split()[0]
|
||||
# action: name.split()[1]
|
||||
|
||||
# for a resource following actions will be generated:
|
||||
# - index
|
||||
# - create
|
||||
# - show
|
||||
# - update
|
||||
# - destroy
|
||||
# - new
|
||||
resources:
|
||||
accounts:
|
||||
url: /accounts
|
||||
|
||||
folders:
|
||||
url: /accounts/{accountId}/folders
|
||||
# actions can be used to define additional actions on the resource
|
||||
actions:
|
||||
- name: validate
|
||||
verb: GET
|
||||
on-collection: false
|
||||
|
||||
* */
|
|
@ -0,0 +1,55 @@
|
|||
<?php
|
||||
|
||||
/**
|
||||
* ownCloud - App Framework
|
||||
*
|
||||
* @author Bernhard Posselt
|
||||
* @copyright 2012 Bernhard Posselt nukeawhale@gmail.com
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 3 of the License, or any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU AFFERO GENERAL PUBLIC LICENSE for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public
|
||||
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
*/
|
||||
|
||||
|
||||
namespace OC\AppFramework\Utility;
|
||||
|
||||
|
||||
class MethodAnnotationReaderTest extends \PHPUnit_Framework_TestCase {
|
||||
|
||||
|
||||
/**
|
||||
* @Annotation
|
||||
*/
|
||||
public function testReadAnnotation(){
|
||||
$reader = new MethodAnnotationReader('\OC\AppFramework\Utility\MethodAnnotationReaderTest',
|
||||
'testReadAnnotation');
|
||||
|
||||
$this->assertTrue($reader->hasAnnotation('Annotation'));
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @Annotation
|
||||
* @param test
|
||||
*/
|
||||
public function testReadAnnotationNoLowercase(){
|
||||
$reader = new MethodAnnotationReader('\OC\AppFramework\Utility\MethodAnnotationReaderTest',
|
||||
'testReadAnnotationNoLowercase');
|
||||
|
||||
$this->assertTrue($reader->hasAnnotation('Annotation'));
|
||||
$this->assertFalse($reader->hasAnnotation('param'));
|
||||
}
|
||||
|
||||
|
||||
}
|
|
@ -8,7 +8,7 @@
|
|||
|
||||
abstract class Test_Cache extends PHPUnit_Framework_TestCase {
|
||||
/**
|
||||
* @var OC_Cache cache;
|
||||
* @var \OC\Cache cache;
|
||||
*/
|
||||
protected $instance;
|
||||
|
||||
|
|
|
@ -20,7 +20,9 @@
|
|||
*
|
||||
*/
|
||||
|
||||
class Test_Cache_File extends Test_Cache {
|
||||
namespace Test\Cache;
|
||||
|
||||
class FileCache extends \Test_Cache {
|
||||
private $user;
|
||||
private $datadir;
|
||||
|
||||
|
@ -30,8 +32,8 @@ class Test_Cache_File extends Test_Cache {
|
|||
|
||||
public function setUp() {
|
||||
//clear all proxies and hooks so we can do clean testing
|
||||
OC_FileProxy::clearProxies();
|
||||
OC_Hook::clear('OC_Filesystem');
|
||||
\OC_FileProxy::clearProxies();
|
||||
\OC_Hook::clear('OC_Filesystem');
|
||||
|
||||
//disabled atm
|
||||
//enable only the encryption hook if needed
|
||||
|
@ -44,27 +46,27 @@ class Test_Cache_File extends Test_Cache {
|
|||
$storage = new \OC\Files\Storage\Temporary(array());
|
||||
\OC\Files\Filesystem::mount($storage,array(),'/');
|
||||
$datadir = str_replace('local::', '', $storage->getId());
|
||||
$this->datadir = OC_Config::getValue('datadirectory', OC::$SERVERROOT.'/data');
|
||||
OC_Config::setValue('datadirectory', $datadir);
|
||||
$this->datadir = \OC_Config::getValue('datadirectory', \OC::$SERVERROOT.'/data');
|
||||
\OC_Config::setValue('datadirectory', $datadir);
|
||||
|
||||
OC_User::clearBackends();
|
||||
OC_User::useBackend(new OC_User_Dummy());
|
||||
\OC_User::clearBackends();
|
||||
\OC_User::useBackend(new \OC_User_Dummy());
|
||||
|
||||
//login
|
||||
OC_User::createUser('test', 'test');
|
||||
\OC_User::createUser('test', 'test');
|
||||
|
||||
$this->user=OC_User::getUser();
|
||||
OC_User::setUserId('test');
|
||||
$this->user = \OC_User::getUser();
|
||||
\OC_User::setUserId('test');
|
||||
|
||||
//set up the users dir
|
||||
$rootView=new \OC\Files\View('');
|
||||
$rootView = new \OC\Files\View('');
|
||||
$rootView->mkdir('/test');
|
||||
|
||||
$this->instance=new OC_Cache_File();
|
||||
$this->instance=new \OC\Cache\File();
|
||||
}
|
||||
|
||||
public function tearDown() {
|
||||
OC_User::setUserId($this->user);
|
||||
OC_Config::setValue('datadirectory', $this->datadir);
|
||||
\OC_User::setUserId($this->user);
|
||||
\OC_Config::setValue('datadirectory', $this->datadir);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -0,0 +1,68 @@
|
|||
<?php
|
||||
/**
|
||||
* ownCloud
|
||||
*
|
||||
* @author Robin Appelman
|
||||
* @copyright 2012 Robin Appelman icewind@owncloud.com
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 3 of the License, or any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU AFFERO GENERAL PUBLIC LICENSE for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public
|
||||
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
*/
|
||||
|
||||
namespace Test\Cache;
|
||||
|
||||
class UserCache extends \Test_Cache {
|
||||
private $user;
|
||||
private $datadir;
|
||||
|
||||
public function setUp() {
|
||||
//clear all proxies and hooks so we can do clean testing
|
||||
\OC_FileProxy::clearProxies();
|
||||
\OC_Hook::clear('OC_Filesystem');
|
||||
|
||||
//disabled atm
|
||||
//enable only the encryption hook if needed
|
||||
//if(OC_App::isEnabled('files_encryption')) {
|
||||
// OC_FileProxy::register(new OC_FileProxy_Encryption());
|
||||
//}
|
||||
|
||||
//set up temporary storage
|
||||
\OC\Files\Filesystem::clearMounts();
|
||||
$storage = new \OC\Files\Storage\Temporary(array());
|
||||
\OC\Files\Filesystem::mount($storage,array(),'/');
|
||||
$datadir = str_replace('local::', '', $storage->getId());
|
||||
$this->datadir = \OC_Config::getValue('datadirectory', \OC::$SERVERROOT.'/data');
|
||||
\OC_Config::setValue('datadirectory', $datadir);
|
||||
|
||||
\OC_User::clearBackends();
|
||||
\OC_User::useBackend(new \OC_User_Dummy());
|
||||
|
||||
//login
|
||||
\OC_User::createUser('test', 'test');
|
||||
|
||||
$this->user = \OC_User::getUser();
|
||||
\OC_User::setUserId('test');
|
||||
|
||||
//set up the users dir
|
||||
$rootView=new \OC\Files\View('');
|
||||
$rootView->mkdir('/test');
|
||||
|
||||
$this->instance=new \OC\Cache\UserCache();
|
||||
}
|
||||
|
||||
public function tearDown() {
|
||||
\OC_User::setUserId($this->user);
|
||||
\OC_Config::setValue('datadirectory', $this->datadir);
|
||||
}
|
||||
}
|
|
@ -0,0 +1,166 @@
|
|||
<?php
|
||||
/**
|
||||
* ownCloud
|
||||
*
|
||||
* @author Thomas Tanghus
|
||||
* @copyright 2012-13 Thomas Tanghus (thomas@tanghus.net)
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 3 of the License, or any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU AFFERO GENERAL PUBLIC LICENSE for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public
|
||||
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
*/
|
||||
|
||||
class Test_Tags extends PHPUnit_Framework_TestCase {
|
||||
|
||||
protected $objectType;
|
||||
protected $user;
|
||||
protected $backupGlobals = FALSE;
|
||||
|
||||
public function setUp() {
|
||||
|
||||
OC_User::clearBackends();
|
||||
OC_User::useBackend('dummy');
|
||||
$this->user = uniqid('user_');
|
||||
$this->objectType = uniqid('type_');
|
||||
OC_User::createUser($this->user, 'pass');
|
||||
OC_User::setUserId($this->user);
|
||||
$this->tagMgr = new OC\TagManager($this->user);
|
||||
|
||||
}
|
||||
|
||||
public function tearDown() {
|
||||
//$query = OC_DB::prepare('DELETE FROM `*PREFIX*vcategories` WHERE `item_type` = ?');
|
||||
//$query->execute(array('test'));
|
||||
}
|
||||
|
||||
public function testInstantiateWithDefaults() {
|
||||
$defaultTags = array('Friends', 'Family', 'Work', 'Other');
|
||||
|
||||
$tagger = $this->tagMgr->load($this->objectType, $defaultTags);
|
||||
|
||||
$this->assertEquals(4, count($tagger->getTags()));
|
||||
}
|
||||
|
||||
public function testAddTags() {
|
||||
$tags = array('Friends', 'Family', 'Work', 'Other');
|
||||
|
||||
$tagger = $this->tagMgr->load($this->objectType);
|
||||
|
||||
foreach($tags as $tag) {
|
||||
$result = $tagger->add($tag);
|
||||
$this->assertGreaterThan(0, $result, 'add() returned an ID <= 0');
|
||||
$this->assertTrue((bool)$result);
|
||||
}
|
||||
|
||||
$this->assertFalse($tagger->add('Family'));
|
||||
$this->assertFalse($tagger->add('fAMILY'));
|
||||
|
||||
$this->assertCount(4, $tagger->getTags(), 'Wrong number of added tags');
|
||||
}
|
||||
|
||||
public function testAddMultiple() {
|
||||
$tags = array('Friends', 'Family', 'Work', 'Other');
|
||||
|
||||
$tagger = $this->tagMgr->load($this->objectType);
|
||||
|
||||
foreach($tags as $tag) {
|
||||
$this->assertFalse($tagger->hasTag($tag));
|
||||
}
|
||||
|
||||
$result = $tagger->addMultiple($tags);
|
||||
$this->assertTrue((bool)$result);
|
||||
|
||||
foreach($tags as $tag) {
|
||||
$this->assertTrue($tagger->hasTag($tag));
|
||||
}
|
||||
|
||||
$this->assertCount(4, $tagger->getTags(), 'Not all tags added');
|
||||
}
|
||||
|
||||
public function testIsEmpty() {
|
||||
$tagger = $this->tagMgr->load($this->objectType);
|
||||
|
||||
$this->assertEquals(0, count($tagger->getTags()));
|
||||
$this->assertTrue($tagger->isEmpty());
|
||||
|
||||
$result = $tagger->add('Tag');
|
||||
$this->assertGreaterThan(0, $result, 'add() returned an ID <= 0');
|
||||
$this->assertNotEquals(false, $result, 'add() returned false');
|
||||
$this->assertFalse($tagger->isEmpty());
|
||||
}
|
||||
|
||||
public function testdeleteTags() {
|
||||
$defaultTags = array('Friends', 'Family', 'Work', 'Other');
|
||||
$tagger = $this->tagMgr->load($this->objectType, $defaultTags);
|
||||
|
||||
$this->assertEquals(4, count($tagger->getTags()));
|
||||
|
||||
$tagger->delete('family');
|
||||
$this->assertEquals(3, count($tagger->getTags()));
|
||||
|
||||
$tagger->delete(array('Friends', 'Work', 'Other'));
|
||||
$this->assertEquals(0, count($tagger->getTags()));
|
||||
|
||||
}
|
||||
|
||||
public function testRenameTag() {
|
||||
$defaultTags = array('Friends', 'Family', 'Wrok', 'Other');
|
||||
$tagger = $this->tagMgr->load($this->objectType, $defaultTags);
|
||||
|
||||
$this->assertTrue($tagger->rename('Wrok', 'Work'));
|
||||
$this->assertTrue($tagger->hasTag('Work'));
|
||||
$this->assertFalse($tagger->hastag('Wrok'));
|
||||
$this->assertFalse($tagger->rename('Wrok', 'Work'));
|
||||
|
||||
}
|
||||
|
||||
public function testTagAs() {
|
||||
$objids = array(1, 2, 3, 4, 5, 6, 7, 8, 9);
|
||||
|
||||
$tagger = $this->tagMgr->load($this->objectType);
|
||||
|
||||
foreach($objids as $id) {
|
||||
$tagger->tagAs($id, 'Family');
|
||||
}
|
||||
|
||||
$this->assertEquals(1, count($tagger->getTags()));
|
||||
$this->assertEquals(9, count($tagger->getIdsForTag('Family')));
|
||||
}
|
||||
|
||||
/**
|
||||
* @depends testTagAs
|
||||
*/
|
||||
public function testUnTag() {
|
||||
$objIds = array(1, 2, 3, 4, 5, 6, 7, 8, 9);
|
||||
|
||||
// Is this "legal"?
|
||||
$this->testTagAs();
|
||||
$tagger = $this->tagMgr->load($this->objectType);
|
||||
|
||||
foreach($objIds as $id) {
|
||||
$this->assertTrue(in_array($id, $tagger->getIdsForTag('Family')));
|
||||
$tagger->unTag($id, 'Family');
|
||||
$this->assertFalse(in_array($id, $tagger->getIdsForTag('Family')));
|
||||
}
|
||||
|
||||
$this->assertEquals(1, count($tagger->getTags()));
|
||||
$this->assertEquals(0, count($tagger->getIdsForTag('Family')));
|
||||
}
|
||||
|
||||
public function testFavorite() {
|
||||
$tagger = $this->tagMgr->load($this->objectType);
|
||||
$this->assertTrue($tagger->addToFavorites(1));
|
||||
$this->assertTrue($tagger->removeFromFavorites(1));
|
||||
}
|
||||
|
||||
}
|
|
@ -1,128 +0,0 @@
|
|||
<?php
|
||||
/**
|
||||
* ownCloud
|
||||
*
|
||||
* @author Thomas Tanghus
|
||||
* @copyright 2012 Thomas Tanghus (thomas@tanghus.net)
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 3 of the License, or any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU AFFERO GENERAL PUBLIC LICENSE for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public
|
||||
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
*/
|
||||
|
||||
//require_once("../lib/template.php");
|
||||
|
||||
class Test_VCategories extends PHPUnit_Framework_TestCase {
|
||||
|
||||
protected $objectType;
|
||||
protected $user;
|
||||
protected $backupGlobals = FALSE;
|
||||
|
||||
public function setUp() {
|
||||
|
||||
OC_User::clearBackends();
|
||||
OC_User::useBackend('dummy');
|
||||
$this->user = uniqid('user_');
|
||||
$this->objectType = uniqid('type_');
|
||||
OC_User::createUser($this->user, 'pass');
|
||||
OC_User::setUserId($this->user);
|
||||
|
||||
}
|
||||
|
||||
public function tearDown() {
|
||||
//$query = OC_DB::prepare('DELETE FROM `*PREFIX*vcategories` WHERE `item_type` = ?');
|
||||
//$query->execute(array('test'));
|
||||
}
|
||||
|
||||
public function testInstantiateWithDefaults() {
|
||||
$defcategories = array('Friends', 'Family', 'Work', 'Other');
|
||||
|
||||
$catmgr = new OC_VCategories($this->objectType, $this->user, $defcategories);
|
||||
|
||||
$this->assertEquals(4, count($catmgr->categories()));
|
||||
}
|
||||
|
||||
public function testAddCategories() {
|
||||
$categories = array('Friends', 'Family', 'Work', 'Other');
|
||||
|
||||
$catmgr = new OC_VCategories($this->objectType, $this->user);
|
||||
|
||||
foreach($categories as $category) {
|
||||
$result = $catmgr->add($category);
|
||||
$this->assertTrue((bool)$result);
|
||||
}
|
||||
|
||||
$this->assertFalse($catmgr->add('Family'));
|
||||
$this->assertFalse($catmgr->add('fAMILY'));
|
||||
|
||||
$this->assertEquals(4, count($catmgr->categories()));
|
||||
}
|
||||
|
||||
public function testdeleteCategories() {
|
||||
$defcategories = array('Friends', 'Family', 'Work', 'Other');
|
||||
$catmgr = new OC_VCategories($this->objectType, $this->user, $defcategories);
|
||||
$this->assertEquals(4, count($catmgr->categories()));
|
||||
|
||||
$catmgr->delete('family');
|
||||
$this->assertEquals(3, count($catmgr->categories()));
|
||||
|
||||
$catmgr->delete(array('Friends', 'Work', 'Other'));
|
||||
$this->assertEquals(0, count($catmgr->categories()));
|
||||
|
||||
}
|
||||
|
||||
public function testrenameCategory() {
|
||||
$defcategories = array('Friends', 'Family', 'Wrok', 'Other');
|
||||
$catmgr = new OC_VCategories($this->objectType, $this->user, $defcategories);
|
||||
|
||||
$this->assertTrue($catmgr->rename('Wrok', 'Work'));
|
||||
$this->assertTrue($catmgr->hasCategory('Work'));
|
||||
$this->assertFalse($catmgr->hasCategory('Wrok'));
|
||||
$this->assertFalse($catmgr->rename('Wrok', 'Work'));
|
||||
|
||||
}
|
||||
|
||||
public function testAddToCategory() {
|
||||
$objids = array(1, 2, 3, 4, 5, 6, 7, 8, 9);
|
||||
|
||||
$catmgr = new OC_VCategories($this->objectType, $this->user);
|
||||
|
||||
foreach($objids as $id) {
|
||||
$catmgr->addToCategory($id, 'Family');
|
||||
}
|
||||
|
||||
$this->assertEquals(1, count($catmgr->categories()));
|
||||
$this->assertEquals(9, count($catmgr->idsForCategory('Family')));
|
||||
}
|
||||
|
||||
/**
|
||||
* @depends testAddToCategory
|
||||
*/
|
||||
public function testRemoveFromCategory() {
|
||||
$objids = array(1, 2, 3, 4, 5, 6, 7, 8, 9);
|
||||
|
||||
// Is this "legal"?
|
||||
$this->testAddToCategory();
|
||||
$catmgr = new OC_VCategories($this->objectType, $this->user);
|
||||
|
||||
foreach($objids as $id) {
|
||||
$this->assertTrue(in_array($id, $catmgr->idsForCategory('Family')));
|
||||
$catmgr->removeFromCategory($id, 'Family');
|
||||
$this->assertFalse(in_array($id, $catmgr->idsForCategory('Family')));
|
||||
}
|
||||
|
||||
$this->assertEquals(1, count($catmgr->categories()));
|
||||
$this->assertEquals(0, count($catmgr->idsForCategory('Family')));
|
||||
}
|
||||
|
||||
}
|
Loading…
Reference in New Issue